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

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

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

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

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

下面是具体的代码:

///<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多线程写锁文件解决方案所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/sjk/1182729.html

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

发表评论

登录后才能评论

评论列表(0条)

保存