Sqlite3 database file is locked 解决办法 与sqlite_reset()

有几天没有更新博文了,这几天参加公司的年会,泡温泉,滑雪,玩得不亦乐乎。作为年会后的第一个工作日,自己终于完成了持续多日的sqlite3数据库测试并解决其中的一个问题,就是database file is locked。

在我们的产品中,我们会new出一个database对象,然后调用open方法打开指定路径下的数据库,如果没有这个数据库,就会自动给用户创建一个。这也是sqlite3 db.sqlite 命令的逻辑。在测试中我发现,如果我调用了sqlite3的函数

sqlite_prepare,sqlite_reset,sqlite_step,sqlite_column_text(),方法后,该数据表就不能被删除了,报的错误码是5,代表database file被锁住了。未解决这个问题,首先就是求救互联网,但是网上很多都是关于多线程的问题,在我们的项目不存在多线程的问题。自己只好自己慢慢一个一个排除。

终于在一个偶然的测试中,自己发现是在查询结束后,没有进行sqlite_reset(),当我进行reset 之后,就可以删除该数据表了。查询的顺序就变为了sqlite_prepare,sqlite_reset,sqlite_step,sqlite_column_text(),sqlite_reset()有人可能会疑问,为什么没有在查询完后调用sqlite_finalize()。在我们的项目中,结果集存在于一个变量中,设计这个变量能不断调用,所以没有选择释放这个查询结果集。而释放结果集的工作我们放到了close函数中,这是我们自己封装的函数,在释放这个结果集资源的同事,断开连接。

为什么调用reset()之后就可以删除了呢,自己也没有答案,需要后面进一步的研究,在这里贴出来,以供大家查询。

解决这个bug之后,自己突然想起以前做生物实验时候,一步步验证排除实验不确定因素的过程。当然这个过程比我上面提到的过程复杂多了。万物还是很多通性的呀。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值