二つの部分に自分の質問に答えるために:リソースを節約シングルトンとして[SQLiteデータベース]接続を使用して
A)でしょうか?
はい、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();
});
}
}
私はDisposeメソッドは、直ちにまたはGCが実行されるまでの接続を解除することを確認していないので、私はGCを呼んでいる理由があります。
sqlite-net-pclのオーナーが[ここ](https://github.com/praeclarum/sqlite-net/issues/480)の質問に答えました。 –
@ ElvisXia-MSFTはい、著者は私に反応するほど親切でした。私の答えは下記をご覧ください。ありがとう –