SQLite多线程写锁文件解决方案
来源:互联网 发布:淘宝上买车险可靠吗 编辑:程序博客网 时间:2024/06/06 01:12
在sqlite编程中多线程同时写时会出现异常,我写了个类来解决这个问题。
思路很简单,就是在开始写操作时,记下写操作的托管线程id,表示目前有线程正在做写操作;其他线程来写时,需要先检测是否有进程正在做写操作,如果有就需要等待,等待到某一个配置的超时时间时,会抛出异常终止等待;如果没有则直接放行,此线程可以获得写锁。最后写操作执行完毕时需要释放锁。
下面是具体的代码:
- /// <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
- }
希望此文有用。
- SQLite多线程写锁文件解决方案
- SQLite多线程写锁文件解决方案
- SQLite 文件锁和写同步
- SQLite 文件锁和写同步
- 多线程并发写文件-文件锁
- Android多线程下操作sqlite数据库解决方案
- 多线程写文件
- 多线程写文件
- 多线程写文件问题解答
- 多线程写文件
- 多线程写文件
- Java多线程写文件
- 多线程写文件操作
- Python多线程写文件实例
- Python多线程写文件实例
- 多线程写文件是否提高效率?
- 多线程环境下SQLite数据库并发访问的解决方案
- SQLite 多线程
- 进程间通信 信号量
- 高精度定时器在mips上的框架结构
- Sqlite内存数据库在多线程下的使用问题
- 自建简单的依赖注入容器Ioc Container
- 快乐面对人生的6个小技巧
- SQLite多线程写锁文件解决方案
- Android.mk文件语法规范
- 转码
- 结构体里的元素前面有一点“.”代表什么意思--结构体成员的初始化
- 海量数据处理
- Pentaho技术白皮书中文版(五)--集成 BIRT 和 Jasper
- 创业皆勤俭:省钱14大绝招 创造性的融资方式
- XQuery基本介绍
- 如何在字符串里查找第一个不重复的字母,即只出现一次的最靠前的字母