1. 使sqlite支持多线程(不确定是否非加不可,暂且加上,以备后患)

可以在编译时/启动时/运行时选择线程模式,参考:http://www.cnblogs.com/liaj/p/4015219.html

我的修改:

1)添加编译选项:

-DSQLITE_THREADSAFE=

2)打开数据库文件使用sqlite3_open_v2替代sqlite3_open

sqlite3_open_v2(strDbName,sqlite_p, SQLITE_OPEN_READWRITE| SQLITE_OPEN_CREATE | SQLITE_OPEN_NOMUTEX, NULL);

2. 使用sqlite3_busy_handler对SQLITE_BUSY状态进行处理(必须)

参考:

https://www.sqlite.org/c3ref/busy_handler.html

http://iihero.iteye.com/blog/1222539

http://blog.csdn.net/guofu8241260/article/details/36378291

我的修改:

static int callback_in_busy(void *ptr, int count)
{
int timeout = *((int *)ptr); usleep(timeout);
return ;
} static void SqlGetLock(sqlite3 *sqlite_p, int ms)
{
if (ms > )
{
sqlite3_busy_handler(sqlite_p, callback_in_busy, (void*)&ms);
}
else
{
sqlite3_busy_handler(sqlite_p, , );
}
} int SqlExec(sqlite3 *sqlite_p, const char *strSql)
{
char *pErrMsg = NULL;
int rc = SQLITE_OK;
int ret = -; SqlGetLock(sqlite_p, );
rc = sqlite3_exec(sqlite_p, strSql, NULL, NULL, &pErrMsg); if (rc != SQLITE_OK)
{
printf("%s %d sqlite3_exec error:%s, strSql = [%s].\n",
__func__, __LINE__, sqlite3_errmsg(sqlite_p), strSql);
if (pErrMsg != NULL)
{
printf("%s %d sqlite3_exec error:%s\n", __func__, __LINE__, pErrMsg);
sqlite3_free(pErrMsg);
}
ret = -;
}
else
{
ret = ;
} return ret;
}

sqlite:多线程操作数据库“database is locked”解决方法的更多相关文章

  1. sqlite:多线程操作数据库“database is locked”解决方法(二)

    上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大 ...

  2. PHP PDO sqlite ,Unable to Open database file的解决方法

    t.php在网站的根目录. fdy.db在inc文件夹下; t.php中sqlite路径写成相对路径 $db = new PDO('sqlite:inc/fdy.db'); 开始提示 Fatal er ...

  3. python 多线程操作数据库

    如果使用多线程操作数据库,容易引起多用户操作锁表 OperationalError: (2013, 'Lost connection to MySQL server during query') 使用 ...

  4. php多线程操作数据库(转)

    PHP用pcntl可以实现多线程操作数据库.直接上代码,逻辑自己研究喽. 示例代码为: /** * 并发多线程运行任务,把任务拆解成区块,用多线程去并发执行 * @param callable $ex ...

  5. mysql5.x升级至mysql5.7后导入之前数据库date出错的解决方法!

    mysql5.x升级至mysql5.7后导入之前数据库date出错的解决方法! 修改mysql5.7的配置文件即可解决,方法如下: linux版:找到mysql的安装路径进入默认的为/usr/shar ...

  6. windows下oracle数据库报错ORA-12705解决方法

    转自:http://blog.sina.com.cn/s/blog_16eaf6b940102x66q.html 有个朋友,他们那边windows虚拟机重启后,数据库不能起来报错ORA-12705无法 ...

  7. sqlite 报错:database is locked

    在sqlite批量添加数据时,报错:database is locked. 解决办法:将db路径由相对路径设置为绝对路径.

  8. SQLITE 多进程查询出错database is locked

    程序比较简单: 父进程查询数据库A表,没有更新操作 子进程同时查询数据库A表,查询出来的内容更新B表. 两个进程都放到while(1)循环中,速度慢的话就是2S执行一次就没有错,执行的速度快的话就会报 ...

  9. svn: E200033: database is locked解决办法

    svn执行update,却被告知database is locked! 执行 svn update,却抛出个错误警报: svn: E200033: database is locked, execut ...

随机推荐

  1. binary-tree-zigzag-level-order-traversal——二叉树分层输出

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  2. 【Python】创建和使用类

    面向对象编程是最有效的软件编写方法之一 创建Dog类 class Dog(): '''一次模拟小狗的简单测试''' def __init__(self,name,age): self.name = n ...

  3. html的table使用div创建

    午休时间写了一个使用div创建table的案例 1.样式 <style> .table { display: table; } .tableRow { display: table-row ...

  4. HandlerMethodArgumentResolver 参数解析器

    关于springMvc中的参数解析器 springMvc中的HandlerAdapter会检测所有的 HandlerMethodArgumentResolver(对参数的解析器) HandlerMet ...

  5. Tomcat安装与IDEA中的配置

    下载Tomcat 先从http://tomcat.apache.org/上下载tomcat9,根据你的系统版本来下载. 本地安装 下载之后解压到你的软件安装目录中,这是我的例子: 然后设置环境变量,如 ...

  6. MagicZoom bug-Strict Standards: Only variables should be assigned by reference Error

    问题:zencart Strict standards: Only variables should be assigned by reference in  jscript_zen_magiczoo ...

  7. python os模块 常用函数

    os.getcwd() 获取当前工作目录 os.listdir() 返回指定目录下的所有文件和目录 os.remove() 删除单个文件 os.path.split() 以元祖形式返回一个路径的目录和 ...

  8. 多媒体开之之rtp 时间戳和负载类型介绍

    (1)时间戳 (2)负载类型 (3)rtp 包头 (1)时间戳 有三个 一个实时间单位 timestamp_increse=(unsigned int)(90000.0 / framerate); / ...

  9. ADO.NET Data Service

    关于ADO.NET Entity Framework部分的内容见ADO.NET Entity Framework(1-4) http://www.cnblogs.com/foundation/arch ...

  10. wmiprvse.exe 进程占CPU过高 问题解决

    wmiprvse.exe是一个系统服务的进程,你可以结束任务,进程自然消失. 禁用Windows Management Instrumentation Driver Extensions服务或者改为手 ...