1

我正在尝试编写一个多线程(使用 NSOperationQueues 进行写入并在主线程上执行读取)应用程序来访问 sqlite 数据库数据。我知道 sqlite 默认不是线程安全的,但是我们添加了多线程预处理器宏并将我们的日志模式设置为 wal。

根据这个 sqlite 文档:http ://www.sqlite.org/faq.html#q6似乎我们需要在编写任何内容之前完成所有准备好的语句。这是真的?有没有办法避免这种情况?如果我们对同一个数据库有两个句柄怎么办?

基本上,我们希望一次进行多次读取和一次写入,但正在尝试找出最佳方法。

提前致谢。

4

1 回答 1

2

线程模式由编译时间、启动或运行时选项决定。更多细节在这里:

http://www.sqlite.org/threadsafe.html

文档说序列化是默认设置,这意味着您可以从多个线程中使用 - 它会保护您所有访问都被序列化。如果您想要更多的并行性,您可以使用具有多个连接对象的多线程模式。

如果您使用多线程,请确保同一数据库连接对象在任何一个时间点不被多个线程使用:

多线程。在这种模式下,SQLite 可以被多个线程安全地使用,前提是没有在两个或多个线程中同时使用单个数据库连接。

但是,请确保复杂性是合理的。与所有性能问题一样,在之前和之后进行测量。

编辑:确保这一点的一种方法是创建自己的池机制。创建一个包含 n 个连接句柄的池,每个并行任务获取并释放到池中。文档说多线程模式在连接之间是完全安全的。这样,您就不必担心所有其他交易或报表都已完成。单独的读取线程/连接和写入线程/连接实际上是一个非常简单的硬编码池。

于 2012-07-03T04:13:24.117 回答