【问题标题】:Closing an SQLiteAsyncConnection关闭 SQLiteAsyncConnection
【发布时间】:2016-12-14 02:58:00
【问题描述】:

我在我的 Xamarin Android 项目中使用 sqlite-net-pcl 库(the one by Frank Krueger,而不是 this fork by Øystein Krog)。目前看来,SQLiteAsyncConnection 没有 Close 或 Dispose 方法according to the author

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

我打算这样做:

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

【问题讨论】:

  • sqlite-net-pcl 拥有者已回答问题here
  • @ElvisXia-MSFT 是的,作者很友好地回复了我。请看下面我的回答。谢谢

标签: c# android sqlite xamarin sqlite-net


【解决方案1】:

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

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 运行之前释放连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-10
    • 2020-05-20
    • 2018-04-17
    • 2018-03-07
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多