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

SQLite多线程写锁文件解决方案,第1张

概述在sqlite编程中多线程同时写时会出现异常,我写了个类来解决这个问题。 思路很简单,就是在开始写 *** 作时,记下写 *** 作的托管线程id,表示目前有线程正在做写 *** 作;其他线程来写时,需要先检测是否有进程正在做写 *** 作,如果有就需要等待,等待到某一个配置的超时时间时,会抛出异常终止等待;如果没有则直接放行,此线程可以获得写锁。最后写 *** 作执行完毕时需要释放锁。 下面是具体的代码: view plain cop

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

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

下面是具体的代码:

view plain copy to clipboard print ? ·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150 ///<summary> ///用于在多线程访问sqlite时防止同步写导致锁文件 /// ///使用方法: ///using(sqliteWriteLocksqliteLock=newsqliteWriteLock(sqlite链接字符串)) ///{ /////sqlite写 *** 作代码 ///} /// ///可以通过在配置文件appSettings节中添加设置sqliteWriteLockTimeout的value值控制锁等待的超时时间,该值必须为正整数数字,单位为毫秒, ///默认的超时时间是1000ms ///</summary> publicsealedclasssqliteWriteLock:Idisposable { #region静态字段和属性 constshortWAIT_TIME=5; staticReadonlyobjectlocker=newobject(); staticDictionary<string,int>_dbThreadIDDict=newDictionary<string,int>(); ///<summary> ///获得写 *** 作的超时时间,单位为毫秒,可以通过配置文件appSettings节中添加设置sqliteWriteLockTimeout的value值控制锁等待的超时时间,该值必须为正整数数字,单位为毫秒 ///默认的超时时间是1000ms ///</summary> publicstaticintsqliteWriteLockTimeout { get { stringconfigValule=ConfigurationManager.AppSettings["sqliteWriteLockTimeout"]; if(!string.IsNullOrEmpty(configValule)) { returnint.Parse(configValule); } return1000; } } #endregion privateReadonlystring_connString; //隐藏无参构造函数 privatesqliteWriteLock(){} publicsqliteWriteLock(stringconnString) { _connString=connString; AcquireWriteLock(); } #region私有方法 privatevoIDAcquireWriteLock() { intthreadID=Thread.CurrentThread.ManagedThreadID; intwaitTimes=0; while(_dbThreadIDDict.ContainsKey(_connString)&&_dbThreadIDDict[_connString]!=threadID) { Thread.Sleep(WAIT_TIME); waitTimes+=WAIT_TIME; #ifDEBUG Console.Writeline(_connString+"waitfor"+waitTimes+"ms"); #endif if(waitTimes>sqliteWriteLockTimeout) { thrownewTimeoutException("sqlite等待写 *** 作超时"); } } lock(locker) { if(!_dbThreadIDDict.ContainsKey(_connString)) _dbThreadIDDict.Add(_connString,threadID); } } privatevoIDReleaseWriteLock() { lock(locker) { if(_dbThreadIDDict.ContainsKey(_connString)) { _dbThreadIDDict.Remove(_connString); } } } #endregion #regionIdisposable成员 publicvoIDdispose() { ReleaseWriteLock(); } #endregion }

希望此文有用。

总结

以上是内存溢出为你收集整理的SQLite多线程写锁文件解决方案全部内容,希望文章能够帮你解决SQLite多线程写锁文件解决方案所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/1175281.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-02
下一篇2022-06-02

发表评论

登录后才能评论

评论列表(0条)

    保存