作者:朱金灿

来源: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的错误的一个解决办法的更多相关文章

  1. Qt5 开发 iOS 应用之访问 SQLite 数据库

    开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 iPhone 6S+iOS 10.1.1   源代码: 我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10.An ...

  2. 【Android】13.4 使用SQLite.NET.Async-PCL访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 这一节演示如何利用以异步方式(async.await)访问SQLite数据库. 二.示例4运行截图 下面左图为初始 ...

  3. 【Android】13.2 使用自定义的CursorAdapter访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 SQliteDemo1的例子演示了SimpleCursorAdapter的用法,本节我们将使用用途更广的自定义的游 ...

  4. 【Android】13.1 用Android自带的API访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 这一节我们先来看看如何直接用Android自带的API创建和访问SQLite数据库. 1.创建SQLite数据库 ...

  5. 【Android】13.0 第13章 创建和访问SQLite数据库—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 Android 内置了三种数据存取方式:SQLite数据库.文件.SharedPreferences. 这一章我们 ...

  6. 【C#】使用EF访问Sqlite数据库

    原文:[C#]使用EF访问Sqlite数据库 1. 先上Nuget下载对应的包 如图,搜索System.Data.SQLite下载安装即可,下载完之后带上依赖一共有这么几个: EntityFramew ...

  7. 以EntifyFramework DBFirst方式访问SQLite数据库

    前面一直在找EF Code First方式来访问SQLite数据库,后面得出的结论是SQLite不支持 Code First, 虽然有非官方的库SQLite.CodeFirst可以使用,但一直没搞成功 ...

  8. Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

    Sqlserver2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 最近几天从网上找了几个asp.net的登录案例想要研究研究代码,结果在用 Sql Server2005附 ...

  9. SQLServer2005+附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

    SQLServer2005+ 附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法 我们在用Sql SQLServer2005+附加数据库文件时弹出错误信息如下图的处理办法: 方案一: ...

随机推荐

  1. Learning Python 012 函数式编程 1 高阶函数

    Python 函数式编程 1 高阶函数 高阶函数 Q:什么是高阶函数? A:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数. 简单举个例子: def add(x, y, f): return ...

  2. 8、非root权限下安装perl以及perl模块

    转载:http://www.cnblogs.com/nkwy2012/p/6418669.html 转载自http://www.zilhua.com 在本博客中,所有的软件安装都在服务器上,且无roo ...

  3. 12、geo数据上传

    1.注册一个NCBI账户 注册geo账户(老用户和新用户): https://www.ncbi.nlm.nih.gov/geo/submitter/ 有3个月的时间 GEO DataSets > ...

  4. C#中的?问号用法总结

    在C#中有个较为重要,而常被一些人忽视的符号——问号(?).在这里整理一下它在C#的几种情况: 可空类型修饰符“T?”:可空类型的基础类型可以是任何非可空值类型或任何具有struct约束的类型参数,但 ...

  5. 28.【转载】挖洞技巧:APP手势密码绕过思路总结

    说到APP手势密码绕过的问题,大家可能有些从来没接触过,或者接触过,但是思路也就停留在那几个点上,这里我总结了我这1年来白帽子生涯当中所挖掘的关于这方面的思路,有些是网上已经有的,有些是我自己不断摸索 ...

  6. rest framework 权限

    一.权限示例 需求:不同的用户类型有不同的权限 普通用户:只能查看个人信息相关,序号:1 VIP 用户:只能查看个人信息相关,序号:2 SVIP 用户:查看订单相关信息,序号:3 1.新建 app/u ...

  7. XML之DTD

    前言 上篇我们知道了,XML的应用范围还是很广的,那么无规矩不成方圆,如果我们每个人写XML的风格不一致,那么读起来是不是很费劲呢?所以格式良好的XML就渐渐的被我们所需要. 内容 格式良好指:拥有正 ...

  8. 互不侵犯king (状压dp)

    互不侵犯king (状压dp) 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.\(1\le n\ ...

  9. bzoj2724: [Violet 6]蒲公英(分块)

    传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间 ...

  10. 在Linux系统下远程连接oracle的防火墙设置

    在Linux系统要远程连接Oracle的防火墙设置方法: 打开5801至5810 端口用于vnc iptables -I INPUT -p tcp --dport 5801:5810 -j ACCEP ...