在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 (_dbThreadIdDict.ContainsKey(_connString) && _dbThreadIdDict[_connString] != threadId)
        {
            Thread.Sleep(WAIT_TIME);
            waitTimes += WAIT_TIME;
#if DEBUG
            Console.WriteLine(_connString + " wait for " + waitTimes + " ms");
#endif
            if (waitTimes > SQLiteWriteLockTimeout)
            {
                throw new TimeoutException("SQLite等待写操作超时");
            }
        }

lock (locker)
        {
            if (!_dbThreadIdDict.ContainsKey(_connString))
                _dbThreadIdDict.Add(_connString, threadId);
        }
    }

private void ReleaseWriteLock()
    {
        lock (locker)
        {
            if (_dbThreadIdDict.ContainsKey(_connString))
            {
                _dbThreadIdDict.Remove(_connString);
            }
        }
    }

#endregion

#region IDisposable 成员

public void Dispose()
    {
        ReleaseWriteLock();
    }

#endregion
}

希望此文有用。

转载于:https://www.cnblogs.com/yukaizhao/archive/2009/02/03/SQLiteWriteLock.html

SQLite多线程写锁文件解决方案相关推荐

  1. SQLite多线程并发操作

    SQLite多线程并发操作 先理清楚一个概念 多线程操作和多数据库连接操作是不同的概念 多线程操作:多线程操作数据库时可以使用一个数据库连接,也可以每个线程使用各自的数据库连接 多数据库连接操作:即每 ...

  2. 多线程断点下载开发总结(二)- 多线程写文件

    2019独角兽企业重金招聘Python工程师标准>>> 上篇文章提到了向服务器请求部分数据,已达到多线程下载的目的. 这里我们看看如何实现多线程写入文件.先看示例代码: String ...

  3. Linux操作系统下如何查看SQLite的数据库文件

    Linux操作系统下如何查看SQLite的数据库文件 **背景:**今天学习第一行代码,学习到SQLite的相关知识,其中学习到创建了数据库和表之后应该如何查看,看了书上的内容并不是很明白,于是上网找 ...

  4. linux下快速打包/多线程压缩文件的方法

    文章目录 打包大量文件 2. 多线程压缩文件 2.1 与tar配合使用 2.2 更多用法 今日遇到一个问题,就是把一个远程主机生成的10万个图片文件(训练集)传到kaggle.所以第一个遇到的问题,就 ...

  5. python多线程读取文件的问题_Python多线程同步---文件读写控制方法

    1.实现文件读写的文件ltz_schedule_times.py #! /usr/bin/env python #coding=utf-8 import os def ReadTimes(): res ...

  6. asp.net core mvc上传大文件解决方案

    asp.net core mvc上传大文件解决方案 参考文章: (1)asp.net core mvc上传大文件解决方案 (2)https://www.cnblogs.com/eggtwo/p/988 ...

  7. JavaScript 下载大文件解决方案(Blob+OjbectURL)

    JavaScript 下载大文件解决方案(Blob+OjbectURL) 参考文章: (1)JavaScript 下载大文件解决方案(Blob+OjbectURL) (2)https://www.cn ...

  8. 『TensorFlow』第十一弹_队列多线程TFRecod文件_我辈当高歌

    TF数据读取队列机制详解 一.TFR文件多线程队列读写操作 TFRecod文件写入操作 import tensorflow as tf def _int64_feature(value):# valu ...

  9. 多线程大文件断点续传和流媒体的处理方法

    2019独角兽企业重金招聘Python工程师标准>>> 在使用Squid做反向代理的CDN节点时.多线程大文件断点续传和流媒体的处理是怎么样啦.前些日子花了点时间研究了一下. 在Sq ...

最新文章

  1. 关于dataTables 的排序问题
  2. gitbook的使用
  3. linux看门狗树莓派,给树莓派安装看门狗
  4. Windows7 Credential Manage
  5. 老鸟程序员才知道的40个小技巧
  6. react(93)--成功置空
  7. 网络爬虫--13.数据提取之JSON与JsonPATH
  8. stm32超声波测距代码_超声波模块另类用法,悬浮,你也能做到
  9. 容器精华问答 | 如何进行跨机器的Container做Link ?
  10. pandas保存为excel,同时设置保存的excel的样式
  11. 2020 AI交流大会 | ALBERT、多模态内容生成、京东零售CV实践、Bias的解决
  12. MVCJSONJQuery分页实现
  13. 特殊回文数,123321是一个非常特殊的数,它从左边读和从右边读是一样的。输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。蓝桥杯问题一次性解答,含JAVA,C++代码
  14. VSCode使用TSLlint校验TS代码
  15. 关于X^(T)Ax,,求关于X的导数。
  16. python求球的表面积_python-Hypar的表面积(双曲线抛物面)
  17. WMS和WMTS的区别
  18. python输出棱形及对称三角
  19. 【Java 数据结构 算法】宁可累死自己, 也要卷死别人 18 贪心算法
  20. 基于离散余弦变换(DCT)傅里叶变换(DFT)小波变换(DWT)的彩色图像数字水印的嵌入、提取简介及MATLAB实现

热门文章

  1. Spring MVC视图解析器
  2. python 语音识别接口_python实现阿里云语音识别api
  3. 身为前端工程师,对你来说,你认为最重要的是什么?
  4. 前端菜鸟是这样入门学习的,点进来!
  5. 深度剖析 | 初学者应该如何学习前端?该怎么学?
  6. clion远程调试linux内核,Clion + 树莓派/Ubuntu 远程调试
  7. python逢七拍手游戏_不学Python迟早会被淘汰?Python真有这么好的前景?
  8. android资源编译失败,在android studio中打开一个新项目时,Android资源编译失败
  9. 7位格雷码计算风向_七哥特刊|从二轮秀到队内得分王 格雷厄姆会新的蜂王吗?...
  10. 问题记录_初始化带有string的结构体