2017-03-21 13 views
0

私はマルチスレッド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がそのように振る舞う原因がわかっているのですか、これについて詳しく知りたいと思う人はいますか?

答えて

0

あなたは、あなたが提案しているが、私は実際に(あなたは、接続文字列で見ることができるように)sqliteのバージョン3.11を使用して_am_ため

public SQLiteConnection dbConnection = new SQLiteConnection(@"Data Source=E:\Foldername\myDatabase.s3db;"); 
SQLiteConnection cnn = new SQLiteConnection(dbConnection); 
      cnn.Open(); 
string sql = "SELECT * FROM Tble_UserSetUp"; 
DataSet ds = new DataSet(); 
SQLiteCommand mycommand = new SQLiteCommand(cnn); 
      mycommand.CommandText = sql; 
SQLiteDataAdapter da = new SQLiteDataAdapter(); 
      da.SelectCommand = mycommand; 
      da.Fill(ds); 
cnn.Close(); 
+0

感謝をSQLiteのバージョン3 ==> .s3dbを使用することができます。 1.0.104は、C#コネクタの場合のバージョンです。 –

+0

このNuGetコンソールでコネクタを更新することができます:Visual Studioで 'PM> Install-Package System.Data.SQLite'。 – AbhiJA

+0

1.0.104が最新のバージョン –

関連する問題