关闭SQLiteAsyncConnection连接

5
我正在我的Xamarin Android项目中使用sqlite-net-pcl库(Frank Krueger的那个,而不是Øystein Krog的这个分支)。目前看来,SQLiteAsyncConnection没有Close或Dispose方法据作者说
我的两个问题是:首先,将连接用作单例是否会节省资源?其次,我可以使用sqliteAsyncConnection.GetConnection().Close()来关闭连接吗?
我计划做以下事情:
public static async Task CloseDbConnectionAsync(SQLiteAsyncConnection dbConnection)
{
    await Task.Factory.StartNew(() => dbConnection.GetConnection().Close());
}

sqlite-net-pcl的所有者已在此处回答了问题(https://github.com/praeclarum/sqlite-net/issues/480)。 - Elvis Xia - MSFT
@ElvisXia-MSFT 是的,作者很好心地回复了我。请看下面我的回答。谢谢。 - Ali Zahid
1个回答

4
为了回答我的问题,分成两个部分:
a) 将[SQLite数据库]连接用作单例模式是否节省资源?
是的,根据这篇文章,让数据库实例成为整个应用程序生命周期中的单例实例可以防止您打开太多的连接并忘记关闭它们。
以下是我在C#中的实现方式:
private static SQLiteAsyncConnection _conn;
private static readonly AsyncLock _mutex = new AsyncLock();

private static async Task<SQLiteAsyncConnection> GetDb(Context context)
{
    try
    {
        using (await _mutex.LockAsync())
        {
            if (_conn != null)
            {
                return _conn;
            }

            _conn = new SQLiteAsyncConnection(GetDbPath(context), storeDateTimeAsTicks: false);

            return _conn;
        }
    }
    catch (Exception e)
    {
        throw;
    }
}

AsycnLock是Nito.AsyncEx库的一部分。

b) 其次,我可以使用sqliteAsyncConnection.GetConnection().Close()来关闭连接吗?

该库的作者已经在这里回复了我。 目前我的disposing方法如下(虽然我没有在任何地方使用它)。

private static async Task DisposeDbConnectionAsync()
{
    using (await _mutex.LockAsync())
    {
        if (_conn == null)
        {
            return;
        }

        await Task.Factory.StartNew(() =>
        {
            _conn.GetConnection().Close();
            _conn.GetConnection().Dispose();
            _conn = null;

            GC.Collect();
            GC.WaitForPendingFinalizers();
        });
    }
}

我之所以调用GC,是因为我不确定dispose方法是否立即释放连接,还是要等到GC运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接