如果启用了池,则SQLiteConnection.Open会保持阻塞状态

时间:2017-03-21 08:58:23

标签: c# .net sqlite

我在多线程C#应用程序中使用System.Data.SQLite(v1.0.104)。当线程想要更​​新数据库时,它会在using语句中打开一个新连接(调用下面的方法)并执行其查询。这似乎适用于以下示例中的连接字符串:

[MethodImpl(MethodImplOptions.Synchronized)]
private SQLiteConnection CreateSQLiteConnection()
{
    var connection = new SQLiteConnection("Data Source=myDatabase.sqlite;Version=3");
    connection.Open();
    return connection;
}

但是,如果我将Pooling=True添加到连接字符串,我可以观察到以下情况:一个线程无限期阻塞connection.Open();,而其他线程正在等待进入CreateSQLiteConnection。据我所知,调试器在这个时间点没有线程实际对数据库执行任何类型的更新。

我已经尝试设置忙碌和默认超时但这并没有改变任何事情。我也知道sqlite文档建议完全避免多个线程但目前不是一个选项。

我添加了Synchronized属性,以避免同时调用SQLiteConnection.Open的多个线程的潜在问题,但似乎没有任何区别。

是否有人知道可能导致SQLiteConnection.Open行为的原因是什么,或者我可以尝试获取更多有关此内容的详细信息?

1 个答案:

答案 0 :(得分:0)

您可以使用SQLite版本3 ==> .s3db,

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();