我目前使用单例来访问我的数据库(参见related question),但现在当尝试添加一些后台处理时,一切都崩溃了。我读了sqlite文档,发现sqlite可以运行线程安全,但每个线程必须有自己的数据库连接。我尝试使用egodatabase承诺一个带有线程安全性的sqlite包装器但是非常错误,所以我回到我原来的FMDB库我开始看看如何以多线程方式使用它。
因为我拥有单例概念的所有代码,所以更改一切都会很昂贵(并且许多开/关连接可能会变慢),所以我想知道,如sqlite文档提示,是否为每个连接构建池会有所帮助。如果是这样,怎么做?如何知道从池中获取哪个连接(因为2个线程无法共享连接)?
我想知道是否有人在使用NSOperation或类似的东西的多线程中使用sqlite,我的搜索只返回“是的,它的可能”但让我的想象中的细节......
答案 0 :(得分:0)
你应该看看使用线程局部变量来保持连接;如果变量为空(即,保持类似NULL
之类的东西),您知道可以安全地在该点打开连接以服务线程并将连接存储回变量中。不过不知道如何用Obj-C做到这一点。
另请注意,SQLite 未针对并发写入进行了调整。编写器锁是昂贵的,因此在写入事务(即,包括INSERT,UPDATE或DELETE的事务)中的任何时间都保持在所有线程中的最小值。交易提交也很昂贵。