我在我的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());
}
最佳答案
用两部分回答我自己的问题:
a)将[sqlite database]连接用作单例连接是否可以节省资源?
是的,根据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()来关闭连接吗?
图书馆的作者已经回复了我。
这就是我目前的处理方法(尽管我没有在任何地方使用它)。
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运行。