2016-12-14 5 views
0

私はXamarin Androidプロジェクト(the one by Frank Kruegerではなくthis fork by Øystein Krog)でsqlite-net-pclライブラリを使用しています。今のところ、SQLiteAsyncConnectionにはCloseメソッドまたはDisposeメソッドがありません。according to the authorSQLiteAsyncConnectionを閉じる

私には2つの質問があります。まず、シングルトンとしての接続を使用してリソースを節約しますか? 2番目にsqliteAsyncConnection.GetConnection()を使用できますか?接続を閉じるにはClose()を使用しますか?

は、私のような何かをすることを計画:

public static async Task CloseDbConnectionAsync(SQLiteAsyncConnection dbConnection) 
{ 
    await Task.Factory.StartNew(() => dbConnection.GetConnection().Close()); 
} 
+0

sqlite-net-pclのオーナーが[ここ](https://github.com/praeclarum/sqlite-net/issues/480)の質問に答えました。 –

+0

@ ElvisXia-MSFTはい、著者は私に反応するほど親切でした。私の答えは下記をご覧ください。ありがとう –

答えて

0

二つの部分に自分の質問に答えるために:リソースを節約シングルトンとして[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を呼んでいる理由があります。