私はマルチスレッドC#アプリケーションでSystem.Data.SQLite
(v1.0.104)を使用しています。スレッドがDBを更新したい場合、using
ステートメント(以下のメソッドを呼び出す)で新しい接続を開き、そのクエリを実行します。これは、次の例では、接続文字列とうまく動作するようです:プールが有効な場合、SQLiteConnection.Openはブロックを維持します
[MethodImpl(MethodImplOptions.Synchronized)]
private SQLiteConnection CreateSQLiteConnection()
{
var connection = new SQLiteConnection("Data Source=myDatabase.sqlite;Version=3");
connection.Open();
return connection;
}
しかし、私は、接続文字列にPooling=True
を追加した場合、私は次のことを観察することができます:他のスレッドが待っている間に1つのスレッドが無期限connection.Open();
にブロックしていますCreateSQLiteConnection
と入力します。私がデバッガから伝える限りでは、現時点ではスレッドは実際にdbに対して何らかの更新を実行していません。
私は既にビジー状態とデフォルトタイムアウトを設定しようとしましたが、何も変更されませんでした。私はまた、sqliteのドキュメントは、複数のスレッドを完全に避けることを示唆していることを知っていますが、現在はオプションではありません。
複数のスレッドが同時にSQLiteConnection.Open
を呼び出すことについての潜在的な問題を避けるために、Synchronized
属性を追加しましたが、違いはありませんでした。
SQLiteConnection.Open
がそのように振る舞う原因がわかっているのですか、これについて詳しく知りたいと思う人はいますか?
感謝をSQLiteのバージョン3 ==> .s3dbを使用することができます。 1.0.104は、C#コネクタの場合のバージョンです。 –
このNuGetコンソールでコネクタを更新することができます:Visual Studioで 'PM> Install-Package System.Data.SQLite'。 – AbhiJA
1.0.104が最新のバージョン –