SQLite多线程写锁文件解决方案
来源:互联网 发布:二小姐脸型数据 南风 编辑:程序博客网 时间:2024/06/05 19:18
在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 多线程
- 深入剖析位运算
- 数据仓库的架构主要有星型和雪花型两种方式
- eclipse中配置struts2
- 0x80---判断一个字符是Ascill字符还是其它字符
- SqlServer查询计划
- SQLite多线程写锁文件解决方案
- 字节对齐算法
- 网络编程之同步,阻塞,异步,非阻塞
- 查看linux系统版本
- 用C#创建Windows服务(Windows Services)
- 自定义的弹出窗口/无菜单栏最大化窗口代码/
- java中File,byte[],Object间的转换
- ZOJ 1671 Walking Ant (BFS)
- 带有命名空间的xml添加属性和元素(c#.NET)