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,所以两个函数会相互影响,设置一个的同时会清除另一个,应根据需要来选择。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值