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\npublic static async Task CloseDbConnectionAsync(SQLiteAsyncConnection dbConnection)\n{\n await Task.Factory.StartNew(() => dbConnection.GetConnection().Close());\n}\nRun Code Online (Sandbox Code Playgroud)\n
分两部分回答我自己的问题:
\n\na)使用 [SQlite 数据库] 连接作为单例会节省资源吗?
\n\n是的,根据这篇文章,使您的数据库实例成为整个应用程序\xe2\x80\x99s生命周期中的单例实例可以防止您打开太多连接而忘记关闭它们。
\n\n这是我在 C# 中实现它的方式:
\n\nprivate 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}\nRun Code Online (Sandbox Code Playgroud)\n\nAsycnLock 是 Nito.AsyncEx 库的一部分。
\n\nb)其次我可以使用 sqliteAsyncConnection.GetConnection().Close() 关闭连接吗?
\n\n该库的作者已在这里回复我。\n这就是我目前的处理方法(尽管我没有在任何地方使用它)。
\n\nprivate 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}\nRun Code Online (Sandbox Code Playgroud)\n\n我调用 GC 的原因是因为我不确定 dispose 方法是否立即释放连接或直到 GC 运行为止。
\n| 归档时间: |
|
| 查看次数: |
4508 次 |
| 最近记录: |