首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确处理不同线程中的sqlite查询?

如何正确处理不同线程中的sqlite查询?
EN

Stack Overflow用户
提问于 2018-05-05 21:03:58
回答 2查看 122关注 0票数 0

我正在开发一个使用sqlite数据库的iPhone应用程序。该应用程序以后台线程的形式从互联网上下载数据,UI位于主线程中。后台下载线程可以在数据库上执行插入、更新和选择。UI层还可以通过执行更新和选择来与数据库交互。如果在后台线程下载时我没有大量地与UI交互,那么一切都会正常工作。但是,当下载过程中在主(UI)线程上执行大量更新时,我开始遇到问题。

在每次对数据库查询时,我都使用@synchronized语句,但这并不能解决问题。当查询(从UI和后台线程)同时执行时,会导致数据丢失。在主线程中更新数据也像在后台一样执行得很好(如果它们彼此独立执行)。

数据库有sqlite3_threadsafe() == 2;对于所有查询,我使用了一个连接,问题可能隐藏在这个连接中?

EN

回答 2

Stack Overflow用户

发布于 2018-05-06 02:44:49

根据the docs,您应该调用sqlite3_config()函数并选择线程模型。我建议先试试SQLITE_CONFIG_SERIALIZED。

还要确保没有在sqlite3_open_v2()中使用SQLITE_OPEN_NOMUTEX标志。

通常,一种好的做法是将所有写操作序列化到单个线程。一种“一个作者-多个读者”的模式。我建议甚至避免所有来自主线程的DB访问,尽管这可能会很复杂,这取决于您拥有的遗留代码的数量。

票数 1
EN

Stack Overflow用户

发布于 2018-05-06 03:48:02

SQLite的线程模式仅保护单个函数调用。但是,每个连接都有一个事务,所以如果有多个线程同时访问数据库,它们仍然会相互干扰。您应该改用多个连接。

如果你想同时读写,可以考虑使用WAL mode

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50189757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档