sqlite3 api sqlite3_busy_timeout 与 sqlite3_busy_handler 的使用与区别

前端之家收集整理的这篇文章主要介绍了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,所以两个函数会相互影响,设置一个的同时会清除另一个,应根据需要来选择。

猜你在找的Sqlite相关文章