c#用SqlSugarClient连接sqlite数据库,有时候报错database is locked
在使用 SqlSugarClient 连接 SQLite 时出现 "database is locked" 错误,通常是由于并发访问或长时间持有数据库锁导致的。
·
在使用 SqlSugarClient 连接 SQLite 时出现 "database is locked" 错误,通常是由于并发访问或长时间持有数据库锁导致的。为了避免这个问题,可以采取以下几种措施:
1. 设置 busy_timeout
在 SQLite 的连接字符串中设置 busy_timeout
参数,以便在数据库被锁定时等待一段时间再重试。
public static SqlSugarClient scla {
get
{
try
{
return new SqlSugarClient(new ConnectionConfig()
{
DbType = DbType.Sqlite,
ConnectionString = "Data Source = " + Path.Combine(ST.DataPath, ST.SchemesLayoutDataBase) + ";busy_timeout=3000;", // 设置 busy_timeout 为 3000 毫秒
IsAutoCloseConnection = true,
});
}
catch (Exception ex)
{
System.Windows.MessageBox.Show("数据库连接异常,请检查!!");
throw new FileNotFoundException("Unsupported database instanceType");
}
}
}
2. 启用 WAL 模式
启用 WAL(写前日志)模式,可以允许更高的并发访问。可以通过 ExecuteCommand
方法执行 PRAGMA 命令来启用 WAL 模式。
public static SqlSugarClient scla {
get
{
try
{
var db = new SqlSugarClient(new ConnectionConfig()
{
DbType = DbType.Sqlite,
ConnectionString = "Data Source = " + Path.Combine(ST.DataPath, ST.SchemesLayoutDataBase) + ";busy_timeout=3000;", // 设置 busy_timeout 为 3000 毫秒
IsAutoCloseConnection = true,
});
// 启用 WAL 模式
db.Ado.ExecuteCommand("PRAGMA journal_mode=WAL;");
return db;
}
catch (Exception ex)
{
System.Windows.MessageBox.Show("数据库连接异常,请检查!!");
throw new FileNotFoundException("Unsupported database instanceType");
}
}
}
3. 确保正确关闭连接
确保在使用完成后正确关闭数据库连接。如果启用了 IsAutoCloseConnection
参数,这一点通常会自动处理。
4. 正确使用事务
在多线程环境中,确保正确使用事务,避免在事务中长时间持有锁。
public void DeleteData<T>(Expression<Func<T, bool>> expression)
{
using (var db = scla)
{
db.Ado.BeginTran();
try
{
db.Deleteable<T>().Where(expression).ExecuteCommand();
db.Ado.CommitTran();
}
catch (Exception ex)
{
db.Ado.RollbackTran();
System.Windows.MessageBox.Show("删除数据时出错:" + ex.Message);
}
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)