在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多线程写锁文件解决方案所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)