sqlite3 api sqlite3_busy_timeout 与 sqlite3_busy_handler 的使用与区别

在用多数据连接方式使用sqlite时,常常会遇到SQLITE_BUSY的错误,这是由于使用当前连接访问数据时,要申请相应级别的锁,而各个级别的锁有些是互斥的,当申请不到锁时就会返回这个错误。这时只要稍等片刻,等其它连接的操作处理完,释放了相斥的锁之后就可以取得锁并进行操作了。

  但是sqlite3中并未对出现sqlite_busy后重试做默认的处理,而是提供了一种处理机制busy handle。有两个api可以创建busy handle。

 

 

int sqlite3_busy_handler(sqlite3 *, int (*)(void *, int), void *)

函数可以定义一个回调函数,当出现数据库忙时,sqlite会调用该函数

当回调函数为NULL时,清除busy handle,申请不到锁直接返回

回调函数的第二个函数会被传递为该由此次忙事件调用该函数的次数

回调函数返回非0,数据库会重试当前操作,返回0则当前操作返回SQLITE_BUSY

 

 

 

int sqlite3_busy_timeout(sqlite3*, int ms);

定义一个毫秒数,当未到达该毫秒数时,sqlite会sleep并重试当前操作

如果超过ms毫秒,仍然申请不到需要的锁,当前操作返回sqlite_BUSY

当ms<=0时,清除busy handle,申请不到锁直接返回

 

 

 

从上面可以得知,一个函数可以控制超时的次数,一个函数可以控制超时的时间

但对于一个连接来说,只能有一个busy handle,所以两个函数会相互影响,设置一个的同时会清除另一个,应根据需要来选择。

猜你喜欢

转载自blog.csdn.net/qingzhuyuxian/article/details/80036008