相关疑难解决方法(0)

如何在多线程应用程序中使用SQLite?

我正在开发一个使用SQLite作为数据库的应用程序,并且在理解如何在多个线程中使用它时遇到一些麻烦(遗憾的是,没有其他Stack Overflow问题对我有帮助).

我的用例:数据库有一个表,我们称之为"A",它有不同的行组(基于其中一个列).我有应用程序的"主线程",它从表A中读取内容.此外,我偶尔决定更新某一组行.为此,我想生成一个新线程,删除该组的所有行,然后重新插入它们(这是在我的应用程序上下文中执行此操作的唯一方法).这可能同时发生在不同的组中,因此我可能有2个以上的线程尝试更新数据库.

我在每个线程的更新周期开始时使用来自每个线程,IE的不同事务,我有一个开始.实际上,每个线程实际上做的是调用"BEGIN",从数据库中删除它需要"更新"的所有行,然后使用新值再次插入它们(这是必须在我的上下文中完成的方式)应用).

现在,我试图了解如何实现这一点.我试过阅读(Stack Overflow上的其他答案,SQLite网站),但我还没有找到所有的答案.以下是我想知道的一些事情:

  1. 我是否需要调用"open"并从每个线程创建一个新的sqlite结构?
  2. 我是否需要为所有这些添加任何特殊代码,或者是否足以生成不同的线程,更新行,这很好(因为我使用不同的事务)?
  3. 我看到有些东西在讨论不同的锁类型,以及我可能会因调用某些API而收到"SQLite忙"的事实,但老实说,当我需要考虑所有这些时,我没有看到任何完全解释的引用.我需要吗?

如果有人能够回答问题/指出我的良好资源方向,我将非常感激.

更新1:从我到目前为止阅读的所有内容看来,无论如何你都不能有两个线程要写入数据库文件.

请参阅:http://www.sqlite.org/lockingv3.html.在3.0节中:RESERVED锁意味着该进程计划在将来的某个时刻写入数据库文件,但它当前只是从文件中读取.虽然多个SHARED锁可以与单个RESERVED锁共存,但一次只能激活一个RESERVED锁.

这是否意味着我每次只能生成一个线程来更新一组行?即,有某种轮询线程决定我需要更新一些行,然后创建一个新线程来执行它,但一次不会超过一个?因为它看起来像我创建的任何其他线程将只获得SQLITE_BUSY,直到第一个线程完成,无论如何.

我理解正确吗?

顺便说一句,感谢到目前为止的答案,他们帮助了很多.

c++ sqlite multithreading

43
推荐指数
4
解决办法
4万
查看次数

标签 统计

c++ ×1

multithreading ×1

sqlite ×1