我在多线程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
行为的原因是什么,或者我可以尝试获取更多有关此内容的详细信息?
答案 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();