使用线程访问数据库

Database access with threading

本文关键字:数据库 访问 线程      更新时间:2023-10-16

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

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

    线程1
    • 等待数据到达(在这种情况下,通过无线电模块)
    • 立即将其插入数据库
    • 返回等待新数据
    • 重要的是,这个线程是"监听"尽可能多的时间,而不是阻塞等待插入到数据库
线程2
    • 每2分钟在数据库上运行一次SELECT,查找未处理的数据
    • 处理数据
    • 用一个标志更新获取的行,以显示它们已被处理
  • 关键是要确保线程1总是可以插入数据库,即使这意味着线程2无法进行SELECT或UPDATE(因为这可能只是在将来的某个点发生,时间并不重要)。

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

    然而,用SQLite和c++线程做这件事的"正确"方法是什么?

    SQlite数据库可以在是否支持多线程的情况下打开。两个线程应该分别打开数据库。如果您想采用比较困难的方法,您可以使用优先级队列来处理查询。