快速业务通道

SQLite多线程写锁文件解决方案

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-04-10

在sqlite编程中多线程同时写时会出现异常,我写了个类来解决这个问题。

思路很简单,就是在开始写操作时,记下写操作的托管线程id,表示目前有线程正在做写操作;其他线程来写时,需要先检测是否有进程正在做写操作,如果有就需要等待,等待到某一个配置的超时时间时,会抛出异常终止等待;如果没有则直接放行,此线程可以获得写锁。最后写操作执行完毕时需要释放锁。

下面是具体的代码:

SQLiteWriteLock
/// <summary>
/// 用于在多线程访问sqlite时防止同步写导致锁文件
///
/// 使用方法:
/// using (SQLiteWriteLock sqliteLock = new SQLiteWriteLock(SQLite链接字符串))
/// {
///     //sqlite 写操作代码
/// }
///
/// 可以通过在配置文件appSettings节中添加设置 SQLiteWriteLockTimeout 的value值控制锁等待的超时时间,该值必须为正整数数字,单位为毫秒,
/// 默认的超时时间是1000ms
/// </summary>
public sealed class SQLiteWriteLock : IDisposable
{
    #region 静态字段和属性
    const short WAIT_TIME = 5;
    static readonly object locker = new object();
    static Dictionary<string, int> _dbThreadIdDict = new Dictionary<string, int>();

    /// <summary>
    /// 获得写操作的超时时间,单位为毫秒,可以通过配置文件appSettings节中添加设置 SQLiteWriteLockTimeout 的value值控制锁等待的超时时间,该值必须为正整数数字,单位为毫秒
    /// 默认的超时时间是1000ms
    /// </summary>
    public static int SQLiteWriteLockTimeout
    {
        get
        {
            string configValule = ConfigurationManager.AppSettings["SQLiteWriteLockTimeout"];
            if (!string.IsNullOrEmpty(configValule))
            {
                return int.Parse(configValule);
            }
            return 1000;
        }
    }
    #endregion

    private readonly string _connString;

    //隐藏无参构造函数
    private SQLiteWriteLock() { }

    public SQLiteWriteLock(string connString)
    {
        _connString = connString;
        AcquireWriteLock();
    }

    #region 私有方法

    private void AcquireWriteLock()
    {
        int threadId = Thread.CurrentThread.ManagedThreadId;

        int waitTimes = 0;
        while (_db

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号