2016-12-14 23 views
0

我在我的Xamarin Android項目中使用sqlite-net-pcl庫(the one by Frank Krueger,而不是this fork by Øystein Krog)。看來,截至目前,SQLiteAsyncConnection沒有Close或Dispose方法according to the author關閉SQLiteAsyncConnection

我有兩個問題。首先,將使用連接作爲單件節約資源?其次,我可以使用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數據庫]連接作爲一個單身節約資源

一)會?

是的,根據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()來關閉連接嗎?

該圖書館的作者回復了我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運行。