基本信息
源码名称:SQLite多线程写入 出现锁文件的解决方案
源码大小:2.33KB
文件格式:.cs
开发语言:C#
更新时间:2014-01-25
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
/// <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 }