【问题标题】:Database access with threading使用线程访问数据库
【发布时间】:2017-01-15 10:42:49
【问题描述】:

我正在开发一个使用 SQLite 作为后端的程序(使用在 Linux 机器上运行的 C++)。

它有 2 个线程执行以下任务:

  • 线程 1
    • 等待一段数据到达(在这种情况下,通过无线电模块)
    • 立即将其插入数据库中
    • 返回等待新数据
    • 重要的是,该线程尽可能多地“侦听”并且不会阻塞等待插入数据库
  • 线程 2
    • 每 2 分钟对数据库运行一次 SELECT 以查找未处理的数据
    • 处理数据
    • 使用标志更新获取的行以显示它们已被处理

关键是要确保线程 1 始终可以插入到数据库中,即使这意味着线程 2 无法选择或更新(因为这可能会在未来发生,所以时间不是危急)。

我希望找到一种使用 SQLite 以某种方式对 INSERT 进行优先级排序的方法,但到目前为止还没有找到方法。另一个想法是线程 1 将数据推送到基本队列(保存在内存中),然后每隔一段时间批量插入(因为这不会阻止数据的接收,并且可以做一个简单的检查以查看数据库被锁定,如果是,请等待几毫秒,然后重试)。

但是,使用 SQLite 和 C++ 线程执行此操作的“正确”方法是什么?

【问题讨论】:

  • 您用来与数据库通信的 API 是否支持异步调用?
  • 不要使用线程 1 插入数据库 - 使用内存队列并从线程 1a 插入。回复:多线程见sqlite.org/threadsafe.html
  • 谢谢,我正在探索队列选项。如果数据量增加,这似乎是最具可扩展性的版本

标签: c++ multithreading sqlite


【解决方案1】:

SQlite 数据库可以在有或没有多线程支持的情况下打开。两个线程都应该分别打开数据库。 如果你想做硬的方式,你可以使用优先队列并处理查询。

【讨论】:

  • 谢谢。很难弄清楚如何检查数据库是否已使用多线程支持进行编译。如果我尝试将它与 sqlite3_config(SQLITE_CONFIG_MULTITHREAD);命令,我们得到一个内存错误。我也在探索队列的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2011-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
相关资源
最近更新 更多