sqlite3之sqlite3_busy_handler使用详解

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


  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sqlite3_busy_handler函数是用来注册一个回调函数,用于处理数据库连接在忙时的情况。当一个线程或进程正在执行一个操作时,其他线程或进程可能会等待数据库连接变为可用。通过注册busy handler回调函数,你可以自定义处理方式来控制等待的行为。 以下是使用sqlite3_busy_handler函数的步骤: 1. 首先,打开一个SQLite数据库连接。 2. 创建一个回调函数,用于处理数据库连接在忙时的情况。回调函数应该具有以下形式: ```c int busy_handler(void *data, int count) { // 在这里编写你的处理逻辑 // 返回非零值表示继续等待,返回零表示停止等待 } ``` 回调函数接受两个参数:void指针data和整数count。data参数可以用来传递额外的数据到回调函数中,count参数表示连续发生忙时的次数。 3. 调用sqlite3_busy_handler函数,传入数据库连接对象和回调函数指针。例如: ```c sqlite3_busy_handler(db, busy_handler, NULL); ``` 这里将回调函数指针和额外数据(在这个例子中为NULL)传递给sqlite3_busy_handler函数。 4. 设置完成后,当一个线程或进程等待数据库连接变为可用时,会调用注册的busy handler回调函数,你可以在该函数中实现你的自定义处理逻辑。 请注意,busy handler回调函数会在等待期间被多次调用,直到返回一个非零值或超过忙时超时时间。 希望这个回答对你有帮助!如果你还有其他关于SQLite或其他方面的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值