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. greenDAO学习分享总结

    greenDAO(最新版本号V2.0.0的Readme) ======== greenDAO is a light & fast ORM solution for Android that m ...

  2. hdu1394 Minimum Inversion Number(最小逆序数)

    Minimum Inversion Number Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/O ...

  3. vscode 右键文件或者文件夹显示菜单

    1.这个是可以在安装时直接选择显示的,如果跟我一样没有选也不愿意重新安装的,可以复制下面代码保存为vsCodeOpenFolder.reg,红色部分是vscode安装路径,换成自己本地路径即可. 双击 ...

  4. 面试题:使用finalkeyword修饰一个变量时,是引用不能变,还是引用的对象不能变?

    /* * 问题:使用finalkeyword修饰一个变量时,是引用不能变,还是引用的对象不能变 * 答: * 使用finalkeyword修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内 ...

  5. Lua学习九----------Lua字符串

    © 版权声明:本文为博主原创文章,转载请注明出处 1.Lua字符串 - ''单引号间的一串字符 - ""双引号之间的一串字符 - [[]]之间的一串字符 2.Lua转义字符 3.字 ...

  6. Spring Resource框架体系介绍

    Resource介绍 在使用spring作为容器进行项目开发中会有很多的配置文件,这些配置文件都是通过Spring的Resource接口来实现加载,但是,Resource对于所有低级资源的访问都不够充 ...

  7. go的timer定时器实现

    示例如下: package main import ( "fmt" "time" ) func testTimer1() { go func() { fmt.P ...

  8. 8148之更换摄像头出现异常---REISZER OVERFLOW OCCURED: RESTARTING

    my iss config as: rsz_reg->SRC_VSZ  = 1079;//715;    rsz_reg->SRC_HSZ  = 1919;//1277; rszA_reg ...

  9. C# Array类的浅复制Clone()与Copy()的差别

    1 Array.Clone方法 命名空间:System 程序集:mscorlib 语法: public Object Clone() Array的浅表副本仅复制Array的元素,不管他们是引用类型还是 ...

  10. rabbitmq 安装-单点

    centos6.5  rabbitmq搭建 环境:centos6.5 192.168.9.41   安装rabbitmq需要先安装erlang.rabbitmq3.6版本需要erlang R16B03 ...