关闭 SQLiteAsyncConnection

Ali*_*hid 5 c# sqlite android xamarin sqlite-net

我在我的 Xamarin Android 项目中使用 sqlite-net-pcl 库(Frank Krueger 的项目,而不是\xc3\x98ystein Krog 的这个 fork)。根据作者的说法,到目前为止,SQLiteAsyncConnection 似乎没有 Close 或 Dispose 方法

\n\n

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

\n\n

我计划做类似的事情:

\n\n
public static async Task CloseDbConnectionAsync(SQLiteAsyncConnection dbConnection)\n{\n    await Task.Factory.StartNew(() => dbConnection.GetConnection().Close());\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Ali*_*hid 4

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

\n\n

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

\n\n

是的,根据这篇文章,使您的数据库实例成为整个应用程序\xe2\x80\x99s生命周期中的单例实例可以防止您打开太多连接而忘记关闭它们。

\n\n

这是我在 C# 中实现它的方式:

\n\n
private static SQLiteAsyncConnection _conn;\nprivate static readonly AsyncLock _mutex = new AsyncLock();\n\nprivate static async Task<SQLiteAsyncConnection> GetDb(Context context)\n{\n    try\n    {\n        using (await _mutex.LockAsync())\n        {\n            if (_conn != null)\n            {\n                return _conn;\n            }\n\n            _conn = new SQLiteAsyncConnection(GetDbPath(context), storeDateTimeAsTicks: false);\n\n            return _conn;\n        }\n    }\n    catch (Exception e)\n    {\n        throw;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

AsycnLock 是 Nito.AsyncEx 库的一部分。

\n\n

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

\n\n

该库的作者已在这里回复我。\n这就是我目前的处理方法(尽管我没有在任何地方使用它)。

\n\n
private static async Task DisposeDbConnectionAsync()\n{\n    using (await _mutex.LockAsync())\n    {\n        if (_conn == null)\n        {\n            return;\n        }\n\n        await Task.Factory.StartNew(() =>\n        {\n            _conn.GetConnection().Close();\n            _conn.GetConnection().Dispose();\n            _conn = null;\n\n            GC.Collect();\n            GC.WaitForPendingFinalizers();\n        });\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我调用 GC 的原因是因为我不确定 dispose 方法是否立即释放连接或直到 GC 运行为止。

\n