sqlite3之sqlite3_busy_handler使用详解
来源:互联网 发布:会计核算软件说明书 编辑:程序博客网 时间:2024/05/01 18:08
int sqlite3_busy_handle(sqlite3*, int(*)(void *, int), void *);此函数的解释在Google上有很多,例如:
第一个参数是当你调用sqlite_busy_handle函数时传递给它的一个void*的参数的拷贝;第二个参数是因此这次锁事件,该回调函数被调用的次数。
如果回调函数返回0时,将不再尝试再次访问数据库而返回SQLITE_BUSY或者SQLITE_IOERR_BLOCKED。
如果回调函数返回非0, 将会不断尝试操作数据库。
函数解释其实大部分是直接翻译的英文文档,至少在我看来,如果没有实际编程操作过sqlite3_busy_handle,会很难理解该函数。以下根据自己程序进行详解。
1.首先定义回调函数,如下:
int callback_db(void *ptr,int count){usleep(500000); //如果获取不到锁,等待0.5秒printf("database is locak now,can not write/read.\n"); //每次执行一次回调函数打印一次该信息return 1; //回调函数返回值为1,则将不断尝试操作数据库。}参数int count为回调函数执行次数,在此处对count值无需要,所以没有进行打印等操作。
char *zErrMsg = 0;int rc;char *sql;int nrow = 0;int ncolumn = 0;char ** azResult; rc = sqlite3_open("MOADB", &db); if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);exit(1);}sql="select xxxxxx from database";<span style="white-space:pre"></span>sqlite3_busy_handler(db,callback_db,(void *)db); //一直等待,直到获得锁sqlite3_get_table(db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );sqlite3_close(db);sqlite3_busy_handler中第三个参数为(void *)db,此参数会传给callback回调函数的第一个参数。
程序运行过程中,如果有其他进程或者线程在读写数据库,那么sqlite3_busy_handler会不断调用回调函数,直到其他进程或者线程释放锁。获得锁之后,不会再调用回调函数,从而向下执行,进行数据库select操作。该函数是在获取不到锁的时候,以执行回调函数的次数来进行延迟,等待其他进程或者线程操作数据库结束,从而获得锁操作数据库。
0 0
- sqlite3之sqlite3_busy_handler使用详解
- sqlite3之sqlite3_busy_handler使用详解
- sqlite3 api sqlite3_busy_timeout 与 sqlite3_busy_handler 的使用与区别
- sqlite3 api sqlite3_busy_timeout 与 sqlite3_busy_handler 的使用与区别
- sqlite3 api sqlite3_busy_timeout 与 sqlite3_busy_handler 的使用与区别
- python之sqlite3使用详解
- python之sqlite3使用详解
- python之sqlite3使用详解
- python之sqlite3使用详解
- python之sqlite3使用详解
- python之sqlite3使用详解
- python之sqlite3使用详解
- python之sqlite3使用详解
- python之sqlite3使用详解
- python之sqlite3使用详解
- python之sqlite3使用详解
- python之sqlite3使用详解
- python之sqlite3使用详解
- 程序员健康小提示--设置健康的myeclipse工作区背景色
- 配置resin支持maven项目
- VS2010程序打包操作
- 物理引擎快速入门指南翻译
- linux下查看mysql表大小
- sqlite3之sqlite3_busy_handler使用详解
- windows平台 culture name 详细列表
- C++Vector用法
- 夏天没胃口吃点酸辣食物刺激食欲
- Block调用引起的内存泄露
- Jersey 实现Rest service
- JBoss 7.1 的端口设置修改
- Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
- 程序员赚钱致富的6种方法