最近面试被问到FMDB的多线程处理问题,因为之前项目中是移植别人的代码,没有踩过这里的坑。

问题:

多线程同时访问数据库时,报数据库锁定的问题,错误信息是:

Unknown error finalizing or resetting statement (5: database is locked)

原因:

文件数据库sqlite,同一时刻允许多个进程/线程读,但同一时刻只允许一个线程写。在操行写操作时,数据库文件被琐定,此时任何其他读/写操作都被阻塞,如果阻塞超过5秒钟(默认是5秒,能过重新编译sqlite可以修改超时时间),就报"database is locked"错误。所以,在操作sqlite时,应该即时关闭连接;打开连接后,尽量减少非常费时的操作。

解决:

FMDatabase **不能多线程使用一个实例多线程访问数据库,不能使用同一个**FMDatabase 的实例。否则会发生异常。如果线程使用单独的FMDatabase 实例是允许的,但是同样有可能发生database is locked的问题。这是由于多线程对sqlite的竞争引起的.

FMDatabaseQueue 解决这个问题的思路是:创建一个队列(串行线程队列),然后将放入的队列的block顺序执行,这样避免了多线程同时访问数据库

解决方案 共享同一个FMDatabaseQueue**实例**

注意:

原本使用FMDatabase类,需要手工调用db的open和close方法,但是用FMDatabaseQueue,不需要调用open,因为查看代码发现,Queue已经open了。

所以,使用Queue,是不需要自己打开和关闭db的。但是如果使用了FMResultSet,rs倒是需要关闭,否则会报warning:
if ([db hasOpenResultSets]) {
NSLog(@"Warning: there is at least one open result set around after performing [FMDatabaseQueue inDatabase:]");

引申阅读

加入GCD信号量控制

Reference:

IOS 使用FMDB多线程访问数据库 及databaseislocked的问题

最新文章

  1. Linux/Unix 怎样找出并删除某一时间点的文件(转)
  2. System-Defined Device Setup Classes Available to Vendors
  3. java获取url中的参数
  4. android入门——BroadCast(2)
  5. DEV中gridview常用属性的设置
  6. XAML: 获取元素的位置
  7. fzu1969 GCD Extreme 类似于uva10561
  8. jenkins定位GitLab推送的最新Webhook中push event来自哪一个分支
  9. Java笔记(day7-day8)
  10. remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
  11. Generative Adversarial Nets[Pre-WGAN]
  12. Hbase记录-ZooKeeper API
  13. js数组获取相同元素个数,归档排序
  14. English trip -- VC(情景课)5 D
  15. 基于CORS的GeoServer跨域访问策略
  16. Git Bash关键命令
  17. Xception
  18. container_of 和 offsetof 宏详解
  19. idea录制宏
  20. SHOI2016 随机序列

热门文章

  1. ubuntu修改字体大小
  2. April 18 2017 Week 16 Tuesday
  3. Android(java)学习笔记66:Android Studio中build.gradle简介
  4. vue中多个元素或多个组件之间的动画效果
  5. 在vue中使用animate库
  6. 【转】批处理命令 For循环命令详解!
  7. jenkin+centos 7 环境搭建
  8. MongoDB数据库CXX Driver编译
  9. 堆优化dijkstra
  10. Oracle 使用Nid 修改数据库的DBID 和 Database Name