检测阻塞数据库问题
Detect blocking DB issue
我在使用 database is locked database is locked Source: System.Data.SQLite
时遇到困难
这里的问题是我 运行 在两个不同的应用程序中使用相同的方法,在一个应用程序中该方法执行得很好,而在另一个应用程序中我得到了这个异常。
我知道我不能同时从两个或多个线程插入,所以我尝试在一开始就调用该方法进行测试,结果是一样的。
方法如下:
internal static void TransferTable()
{
String full_path = System.Reflection.Assembly.GetCallingAssembly().GetName().CodeBase;
String directory_path = full_path.Substring(0, full_path.LastIndexOf("\"));
string pathDB = System.IO.Path.Combine(directory_path, "Data\DB1.s3db");
conString = @" Data Source = " + pathDB;
using (SQLiteConnection con = new SQLiteConnection(conString))
{
con.Open();
try
{
using (SQLiteCommand cmd = con.CreateCommand())
{
cmd.CommandText = "ATTACH '" + pathDB + "' AS TOMERGE";
int retval = 0;
try
{
retval = cmd.ExecuteNonQuery();
}
catch (Exception ex) { Log.Fatal(ex.Message); }
string SQL = "INSERT OR REPLACE INTO Person SELECT * FROM TOMERGE.Person";
cmd.CommandText = SQL;
retval = 0;
try
{
retval = cmd.ExecuteNonQuery();
}
catch (Exception ex) { Log.Fatal(ex.Message); }
}
}
catch (Exception ex) { Log.Fatal(ex.Message); }
finally { con.Close(); GC.Collect(); }
}
}
如何检测出问题所在?
通常情况下,sqlite 会自行处理文件锁定、共享和独占访问。
要控制哪个线程何时获得锁,您可以使用 BEGIN [TRANSACTION],最后使用 COMMIT(参见 http://www.sqlite.org/lockingv3.html)
或者你可以使用 PRAGMA locking_mode = exclusive plus BEGIN EXCUSIVE / COMMIT.
然后检查访问数据库锁定状态的processes/threads,并在一段时间后重试。
我在使用 database is locked database is locked Source: System.Data.SQLite
这里的问题是我 运行 在两个不同的应用程序中使用相同的方法,在一个应用程序中该方法执行得很好,而在另一个应用程序中我得到了这个异常。 我知道我不能同时从两个或多个线程插入,所以我尝试在一开始就调用该方法进行测试,结果是一样的。
方法如下:
internal static void TransferTable()
{
String full_path = System.Reflection.Assembly.GetCallingAssembly().GetName().CodeBase;
String directory_path = full_path.Substring(0, full_path.LastIndexOf("\"));
string pathDB = System.IO.Path.Combine(directory_path, "Data\DB1.s3db");
conString = @" Data Source = " + pathDB;
using (SQLiteConnection con = new SQLiteConnection(conString))
{
con.Open();
try
{
using (SQLiteCommand cmd = con.CreateCommand())
{
cmd.CommandText = "ATTACH '" + pathDB + "' AS TOMERGE";
int retval = 0;
try
{
retval = cmd.ExecuteNonQuery();
}
catch (Exception ex) { Log.Fatal(ex.Message); }
string SQL = "INSERT OR REPLACE INTO Person SELECT * FROM TOMERGE.Person";
cmd.CommandText = SQL;
retval = 0;
try
{
retval = cmd.ExecuteNonQuery();
}
catch (Exception ex) { Log.Fatal(ex.Message); }
}
}
catch (Exception ex) { Log.Fatal(ex.Message); }
finally { con.Close(); GC.Collect(); }
}
}
如何检测出问题所在?
通常情况下,sqlite 会自行处理文件锁定、共享和独占访问。
要控制哪个线程何时获得锁,您可以使用 BEGIN [TRANSACTION],最后使用 COMMIT(参见 http://www.sqlite.org/lockingv3.html)
或者你可以使用 PRAGMA locking_mode = exclusive plus BEGIN EXCUSIVE / COMMIT.
然后检查访问数据库锁定状态的processes/threads,并在一段时间后重试。