将连接池化有助于sqlite中的线程(以及如何)?

Posted

技术标签:

【中文标题】将连接池化有助于sqlite中的线程(以及如何)?【英文标题】:Will pool the connection help threading in sqlite (and how)? 【发布时间】:2010-04-08 21:08:03 【问题描述】:

我目前使用单例来访问我的数据库(请参阅related question),但现在当尝试添加一些后台处理时,一切都崩溃了。我阅读了 sqlite 文档,发现 sqlite 可以在线程安全的情况下工作,但每个线程都必须有自己的数据库连接。我尝试使用egodatabase,它承诺了一个具有线程安全性的 sqlite 包装器,但有很多错误,所以我回到我的旧 FMDB 库,开始了解如何以多线程方式使用它。

因为我所有的代码都带有单例的想法,所以改变一切都会很昂贵(而且很多打开/关闭连接可能会变得很慢),所以我想知道是否像 sqlite 文档提示的那样为每个连接构建一个池会有所帮助。如果是这样,如何实现?如何知道从池中获取哪个连接(因为2个线程不能共享连接)?

我想知道是否有人已经在 NSOperation 或类似的东西的多线程中使用 sqlite,我的搜索只返回“是的,它可能”,但让我想象一下细节......

【问题讨论】:

【参考方案1】:

您应该考虑使用线程局部变量来保持连接;如果变量为空(即,持有类似NULL 的东西),您知道您可以在该点安全地打开连接以服务线程并将连接存储回变量中。不过不知道如何用 Obj-C 做到这一点。

另外请注意,SQLite 没有针对并发写入进行了调整。写入器锁很昂贵,因此在所有线程中将写入事务(即包括 INSERT、UPDATE 或 DELETE 的事务)中的任何时间保持在最低限度。事务提交也很昂贵。

【讨论】:

以上是关于将连接池化有助于sqlite中的线程(以及如何)?的主要内容,如果未能解决你的问题,请参考以下文章

含源码解析,深入Java 线程池原理

内存池进程池线程池

JDBC 基本概念、池化和线程化

多线程使用~会多少?

如何将图像存储为 Sqlite 中的 blob 以及如何检索它?

java高并发之线程池