我在我的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());
}
答案 0 :(得分:2)
分两部分回答我自己的问题:
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()。关闭()来关闭连接吗?
图书馆的作者回复了我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运行。