2010-04-08 26 views
0

我目前使用单例来访问我的数据库(请参阅related question),但现在尝试添加一些背景处理时,一切都会崩溃。我阅读sqlite文档,发现sqlite可以工作线程安全,但每个线程必须有自己的数据库连接。我尝试使用egodatabase,承诺一个线程安全的sqlite包装,但是很麻烦,所以我回到我的旧FMDB库,我开始看到如何以多线程方式使用它。将连接帮助线程在sqlite中(以及如何)汇集?

因为我的所有代码都带有单例的想法,所以改变一切将会很昂贵(并且很多开放/关闭连接会变得很慢),所以我想知道是否像sqlite文档提示一样为每个连接将有所帮助。如果是这样的话,怎么样呢?如何知道从池中获取哪个连接(因为2个线程无法共享连接)?用的NSOperation或类似的东西

我不知道是否有人已经在使用SQLite多线程,我唯一的搜索返回“是的,它可能”,但让细节我的想象......

回答

0

你应该看看使用线程局部变量来保存连接;如果变量为空(即,持有像NULL之类的东西),则您知道可以安全地在该位置打开一个连接来为线程提供服务并将连接存储回变量。不知道如何与Obj-C做到这一点。

另外请注意,SQLite是而不是调整为并发写入。编写器锁是昂贵的,因此在写入事务(即包含INSERT,UPDATE或DELETE的事务)中的任何时间都要保持在所有线程中的最小值。交易提交也很昂贵。