在使用 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);
        }
    }
}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐