sqlite:多线程操作数据库“database is locked”解决方法

王朝学院·作者佚名  2016-05-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

sqlite:多线程操作数据库“database is locked”解决方法1. 使sqlite支持多线程(不确定是否非加不可,暂且加上,以备后患)

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

我的修改:

1)添加编译选项:

-DSQLITE_THREADSAFE=2

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 1;}static void SqlGetLock(sqlite3 *sqlite_p, int ms){ if (ms > 0) { sqlite3_busy_handler(sqlite_p, callback_in_busy, (void*)&ms); } else { sqlite3_busy_handler(sqlite_p, 0, 0); }}int SqlExec(sqlite3 *sqlite_p, const char *strSql){ char *pErrMsg = NULL; int rc = SQLITE_OK; int ret = -1; SqlGetLock(sqlite_p, 200); 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 = -1; } else { ret = 0; } return ret;}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航