并发访问sqlite数据库出现databse is locked的错误的一个解决办法
作者:朱金灿
来源:http://blog.csdn.net/clever101
在并发访问sqlite数据库会出现这样一个错误:databseis locked,这是sqlite数据库对并发支持不太好的缘故造成的。采用网上的一种的思路是通过互斥信号量来达到并发访问的目的。下面是一个跨平台的互斥信号量类:
- //ProcessMutex.h文件:
- #ifndef __PROCESS_MUTEX_H__
- #define __PROCESS_MUTEX_H__
- #if defined _WIN32 || defined _WIN64
- #include <Windows.h>
- #endif
- #ifdef linux
- #include <unistd.h>
- #include <semaphore.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <signal.h>
- #include <string.h>
- #include <memory.h>
- #endif
- class CProcessMutex
- {
- public:
- /* 默认创建匿名的互斥 */
- CProcessMutex(const char* name = NULL);
- ~CProcessMutex();
- bool Lock();
- bool UnLock();
- private:
- #if defined _WIN32 || defined _WIN64
- void* m_pMutex;
- #endif
- #ifdef linux
- set_t* m_pSem;
- #ednif
- char m_cMutexName[30];
- };
- #endif
- //ProcessMutex.cpp文件:
- #include "ProcessMutex.h"
- #if defined _WIN32 || defined _WIN64
- CProcessMutex::CProcessMutex(const char* name)
- {
- memset(m_cMutexName, 0 ,sizeof(m_cMutexName));
- int min = strlen(name)>(sizeof(m_cMutexName)-1)?(sizeof(m_cMutexName)-1):strlen(name);
- strncpy(m_cMutexName, name, min);
- m_pMutex = CreateMutex(NULL, false, m_cMutexName);
- }
- CProcessMutex::~CProcessMutex()
- {
- CloseHandle(m_pMutex);
- }
- bool CProcessMutex::Lock()
- {
- //互斥锁创建失败
- if (NULL == m_pMutex)
- {
- return false;
- }
- DWORD nRet = WaitForSingleObject(m_pMutex, INFINITE);
- if (nRet != WAIT_OBJECT_0)
- {
- return false;
- }
- return true;
- }
- bool CProcessMutex::UnLock()
- {
- return ReleaseMutex(m_pMutex);
- }
- #endif
- #ifdef linux
- CProcessMutex::CProcessMutex(const char* name)
- {
- memset(m_cMutexName, 0 ,sizeof(m_cMutexName));
- int min = strlen(name)>(sizeof(m_cMutexName)-1)?(sizeof(m_cMutexName)-1):strlen(name);
- strncpy(m_cMutexName, name, min);
- m_pSem = sem_open(name, O_CREAT, 0644, 1);
- }
- CProcessMutex::~CProcessMutex()
- {
- int ret = sem_close(m_pSem);
- if (0 != ret)
- {
- printf("sem_close error %d\n", ret);
- }
- sem_unlink(m_cMutexName);
- }
- bool CProcessMutex::Lock()
- {
- int ret = sem_wait(m_pSem);
- if (ret != 0)
- {
- return false;
- }
- return true;
- }
- bool CProcessMutex::UnLock()
- {
- int ret = sem_post(m_pSem);
- if (ret != 0)
- {
- return false;
- }
- return true;
- }
- #endif
使用示例代码如下:
- CProcessMutex pMutex("MutexName");
- pMutex.Lock();
- sqlite3_exec( myconn, sql, 0, 0, &m_sqlerr_msg); // 执行sqlite的相关操作
- pMutex.UnLock();
参考文献:
1. 多进程之间的互斥信号量的实现(Linux和windows跨平台)
2.sqlite遇到database is locked问题的完美解决
并发访问sqlite数据库出现databse is locked的错误的一个解决办法的更多相关文章
- Qt5 开发 iOS 应用之访问 SQLite 数据库
开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 iPhone 6S+iOS 10.1.1 源代码: 我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10.An ...
- 【Android】13.4 使用SQLite.NET.Async-PCL访问SQLite数据库
分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 这一节演示如何利用以异步方式(async.await)访问SQLite数据库. 二.示例4运行截图 下面左图为初始 ...
- 【Android】13.2 使用自定义的CursorAdapter访问SQLite数据库
分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 SQliteDemo1的例子演示了SimpleCursorAdapter的用法,本节我们将使用用途更广的自定义的游 ...
- 【Android】13.1 用Android自带的API访问SQLite数据库
分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 这一节我们先来看看如何直接用Android自带的API创建和访问SQLite数据库. 1.创建SQLite数据库 ...
- 【Android】13.0 第13章 创建和访问SQLite数据库—本章示例主界面
分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 Android 内置了三种数据存取方式:SQLite数据库.文件.SharedPreferences. 这一章我们 ...
- 【C#】使用EF访问Sqlite数据库
原文:[C#]使用EF访问Sqlite数据库 1. 先上Nuget下载对应的包 如图,搜索System.Data.SQLite下载安装即可,下载完之后带上依赖一共有这么几个: EntityFramew ...
- 以EntifyFramework DBFirst方式访问SQLite数据库
前面一直在找EF Code First方式来访问SQLite数据库,后面得出的结论是SQLite不支持 Code First, 虽然有非官方的库SQLite.CodeFirst可以使用,但一直没搞成功 ...
- Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用 Sql Server2005附 ...
- SQLServer2005+附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
SQLServer2005+ 附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 我们在用Sql SQLServer2005+附加数据库文件时弹出错误信息如下图的处理办法: 方案一: ...
随机推荐
- 使用GEO数据库来筛选差异表达基因,KOBAS进行KEGG注释分析
前言 本文主要演示GEO数据库的一些工具,使用的数据是2015年在Nature Communications上发表的文章Regulation of autophagy and the ubiquiti ...
- p1516&poj1061&bzoj1477 青蛙的约会
传送门(洛谷) 题目 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情 ...
- Struts2学习第五课 通过和ServletAPI耦合的方式获取WEB资源
与Servlet耦合的访问方式 直接访问Servlet API将使Action与环境Servlet环境耦合在一起,测试时需要有Servlet容器,不便对Action的单元测试. 直接获取HttpSer ...
- c++中Int装string
java中,string类型非常强大,任何类型和string类型相加都变成了string类型.但是c++中string功能就比较少 int转string有两种方式 1:stringstream; ; ...
- Windows form UI skinEngine的使用方法
1.安装SkinEngine(这里安装的是3.4.7) 链接: https://pan.baidu.com/s/1-kZ5KgYclshWc17jbuke5w 提取码: bp7n 复制这段内容后打开百 ...
- Glance代码分析
V2版本的glance-api采用Proxy的方式来构建对象(对象套对象),有点类似装饰器模式,包裹的顺序是 Auth(外层) -> Notifier -> Policy -> Qu ...
- 虚拟创建失败之Dbus调试
DBus调试命令 查询连接名 ### 查询所有连接名 # dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.free ...
- 51nod1307(暴力树剖/二分&dfs/并查集)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 中文题诶~ 思路: 解法1:暴力树剖 用一个数 ...
- mui 上拉加载更多的使用
最近工作之余在用mui的框架开发,对mui了解了一些.在真正的app开发项目中,mui上拉加载模块中有两个坑,现在说一下. 1.在函数自己上拉加载行为后的回调函数 该函数是必须要写的,用来写自己的逻辑 ...
- before和after兼容性测试
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...