关闭 SQLiteAsyncConnection

Closing an SQLiteAsyncConnection

我在 Xamarin Android 项目中使用 sqlite-net-pcl 库 (the one by Frank Krueger, not this fork by Øystein Krog). It seems that as of now, the SQLiteAsyncConnection does not have a Close or Dispose method according to the author.

我有两个问题。首先,将连接用作单例会节省资源吗?其次,我可以使用 sqliteAsyncConnection.GetConnection().Close() 关闭连接吗?

我打算做类似的事情:

public static async Task CloseDbConnectionAsync(SQLiteAsyncConnection dbConnection)
{
    await Task.Factory.StartNew(() => dbConnection.GetConnection().Close());
}

分两部分回答我自己的问题:

a) 将 [SQlite 数据库] 连接用作单例会节省资源吗?

是的,根据 this article,让您的数据库实例成为贯穿整个应用程序生命周期的单例实例可以防止您打开太多连接而忘记关闭它们。

这是我在 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() 关闭连接吗?

图书馆的作者已经回复我了here。 这是目前我的处理方法的样子(虽然我没有在任何地方使用它)。

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 运行。