加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

sqlite3之sqlite3_busy_handler使用详解

发布时间:2020-12-12 19:59:50 所属栏目:百科 来源:网络整理
导读:int sqlite3_busy_handle(sqlite3*,int(*)(void *,int),void *);此函数的解释在Google上有很多,例如: 第一个参数是当你调用sqlite_busy_handle函数时传递给它的一个void*的参数的拷贝;第二个参数是因此这次锁事件,该回调函数被调用的次数。 如果回调函数

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: %sn",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操作。该函数是在获取不到锁的时候,以执行回调函数的次数来进行延迟,等待其他进程或者线程操作数据库结束,从而获得锁操作数据库。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读