作者:朱金灿

来源:http://blog.csdn.net/clever101

在并发访问sqlite数据库会出现这样一个错误:databseis locked,这是sqlite数据库对并发支持不太好的缘故造成的。采用网上的一种的思路是通过互斥信号量来达到并发访问的目的。下面是一个跨平台的互斥信号量类:

  1. //ProcessMutex.h文件:
  2. #ifndef __PROCESS_MUTEX_H__
  3. #define __PROCESS_MUTEX_H__
  4.  
  5. #if defined _WIN32 || defined _WIN64
  6.  
  7. #include <Windows.h>
  8.  
  9. #endif
  10.  
  11. #ifdef linux
  12. #include <unistd.h>
  13. #include <semaphore.h>
  14. #include <stdio.h>
  15. #include <fcntl.h>
  16. #include <signal.h>
  17. #include <string.h>
  18. #include <memory.h>
  19. #endif
  20.  
  21. class CProcessMutex
  22. {
  23. public:
  24. /* 默认创建匿名的互斥 */
  25. CProcessMutex(const char* name = NULL);
  26. ~CProcessMutex();
  27.  
  28. bool Lock();
  29. bool UnLock();
  30. private:
  31.  
  32. #if defined _WIN32 || defined _WIN64
  33.  
  34. void* m_pMutex;
  35.  
  36. #endif
  37.  
  38. #ifdef linux
  39. set_t* m_pSem;
  40. #ednif
  41. char m_cMutexName[30];
  42. };
  43. #endif
  44.  
  45. //ProcessMutex.cpp文件:
  46. #include "ProcessMutex.h"
  47.  
  48. #if defined _WIN32 || defined _WIN64
  49.  
  50. CProcessMutex::CProcessMutex(const char* name)
  51. {
  52. memset(m_cMutexName, 0 ,sizeof(m_cMutexName));
  53. int min = strlen(name)>(sizeof(m_cMutexName)-1)?(sizeof(m_cMutexName)-1):strlen(name);
  54. strncpy(m_cMutexName, name, min);
  55. m_pMutex = CreateMutex(NULL, false, m_cMutexName);
  56. }
  57.  
  58. CProcessMutex::~CProcessMutex()
  59. {
  60. CloseHandle(m_pMutex);
  61. }
  62.  
  63. bool CProcessMutex::Lock()
  64. {
  65. //互斥锁创建失败
  66. if (NULL == m_pMutex)
  67. {
  68. return false;
  69. }
  70.  
  71. DWORD nRet = WaitForSingleObject(m_pMutex, INFINITE);
  72. if (nRet != WAIT_OBJECT_0)
  73. {
  74. return false;
  75. }
  76.  
  77. return true;
  78. }
  79.  
  80. bool CProcessMutex::UnLock()
  81. {
  82. return ReleaseMutex(m_pMutex);
  83. }
  84.  
  85. #endif
  86.  
  87. #ifdef linux
  88.  
  89. CProcessMutex::CProcessMutex(const char* name)
  90. {
  91. memset(m_cMutexName, 0 ,sizeof(m_cMutexName));
  92. int min = strlen(name)>(sizeof(m_cMutexName)-1)?(sizeof(m_cMutexName)-1):strlen(name);
  93. strncpy(m_cMutexName, name, min);
  94. m_pSem = sem_open(name, O_CREAT, 0644, 1);
  95. }
  96.  
  97. CProcessMutex::~CProcessMutex()
  98. {
  99. int ret = sem_close(m_pSem);
  100. if (0 != ret)
  101. {
  102. printf("sem_close error %d\n", ret);
  103. }
  104. sem_unlink(m_cMutexName);
  105. }
  106.  
  107. bool CProcessMutex::Lock()
  108. {
  109. int ret = sem_wait(m_pSem);
  110. if (ret != 0)
  111. {
  112. return false;
  113. }
  114. return true;
  115. }
  116.  
  117. bool CProcessMutex::UnLock()
  118. {
  119. int ret = sem_post(m_pSem);
  120. if (ret != 0)
  121. {
  122. return false;
  123. }
  124. return true;
  125. }
  126.  
  127. #endif

使用示例代码如下:

  1. CProcessMutex pMutex("MutexName");
  2.  
  3. pMutex.Lock();
  4.  
  5. sqlite3_exec( myconn, sql, 0, 0, &m_sqlerr_msg); // 执行sqlite的相关操作
  6.  
  7. 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. 使用GEO数据库来筛选差异表达基因,KOBAS进行KEGG注释分析

    前言 本文主要演示GEO数据库的一些工具,使用的数据是2015年在Nature Communications上发表的文章Regulation of autophagy and the ubiquiti ...

  2. p1516&poj1061&bzoj1477 青蛙的约会

    传送门(洛谷) 题目 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情 ...

  3. Struts2学习第五课 通过和ServletAPI耦合的方式获取WEB资源

    与Servlet耦合的访问方式 直接访问Servlet API将使Action与环境Servlet环境耦合在一起,测试时需要有Servlet容器,不便对Action的单元测试. 直接获取HttpSer ...

  4. c++中Int装string

    java中,string类型非常强大,任何类型和string类型相加都变成了string类型.但是c++中string功能就比较少 int转string有两种方式 1:stringstream; ; ...

  5. Windows form UI skinEngine的使用方法

    1.安装SkinEngine(这里安装的是3.4.7) 链接: https://pan.baidu.com/s/1-kZ5KgYclshWc17jbuke5w 提取码: bp7n 复制这段内容后打开百 ...

  6. Glance代码分析

    V2版本的glance-api采用Proxy的方式来构建对象(对象套对象),有点类似装饰器模式,包裹的顺序是 Auth(外层) -> Notifier -> Policy -> Qu ...

  7. 虚拟创建失败之Dbus调试

    DBus调试命令 查询连接名 ### 查询所有连接名 # dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.free ...

  8. 51nod1307(暴力树剖/二分&dfs/并查集)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 中文题诶~ 思路: 解法1:暴力树剖 用一个数 ...

  9. mui 上拉加载更多的使用

    最近工作之余在用mui的框架开发,对mui了解了一些.在真正的app开发项目中,mui上拉加载模块中有两个坑,现在说一下. 1.在函数自己上拉加载行为后的回调函数 该函数是必须要写的,用来写自己的逻辑 ...

  10. before和after兼容性测试

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...