sqlite3_busy_handle
来源:互联网 发布:pm2.5数据网 编辑:程序博客网 时间:2024/04/29 18:10
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,则将不断尝试操作数据库。
- }
- 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会不断调用回调函数,直到其他进程或者线程释放锁。获得锁之后,不会再调用回调函数,从而向下执行,进行数据库select操作。该函数是在获取不到锁的时候,以执行回调函数的次数来进行延迟,等待其他进程或者线程操作数据库结束,从而获得锁操作数据库。
0 0
- sqlite3_busy_handle
- S5PV210启动过程分析
- Java小程序:实现三边是否能构成三角形
- 『Python思考』利用字典来保存程序中的文件地址(路径名)
- 操作系统实验指导书(完整版)
- leetcode---Letter Combinations of a Phone Number---深搜
- sqlite3_busy_handle
- 往Oracle数据库中插入日期型数据(to_date的用法)
- 矩阵相乘,矩阵转换
- 关于实际开发中优化web的一些小技巧汇总(持续更新中)
- WCF学习笔记——WCF基础
- 代理模式
- ajax+jQuery实现一个页面同时加载多个模块!
- 验证篇(5.2)-03. 手机通过域服务器访问内网 ❀ 飞塔 (Fortinet) 防火墙
- android内核基础