将 sqlite 用于数据库队列的最佳实践

Posted

技术标签:

【中文标题】将 sqlite 用于数据库队列的最佳实践【英文标题】:best practices for using sqlite for a database queue 【发布时间】:2009-10-27 14:06:11 【问题描述】:

我正在为生产者-消费者队列使用 sqlite 数据库。

一个或多个生产者使用新的自动递增主键一次插入一行。

有一个消费者(在 java 中实现,使用 sqlite-jdbc 库),我希望它读取一批行并删除它们。似乎我需要事务来执行此操作,但尝试将 SQLite 与事务一起使用似乎无法正常工作。我是不是想多了?

如果我最终需要事务,那么在 Java 中执行此操作的正确方法是什么?

 Connection conn;
 // assign here

 boolean success = false;
 try 
    // do stuff
    success = true;
 
 finally
 
    if (success)
       conn.commit();
    else
       conn.rollback();
 

【问题讨论】:

【参考方案1】:

请参阅this trail,了解有关使用 Java JDBC 进行事务处理的介绍。

至于您的用例,我认为您应该使用事务,尤其是在消费者很复杂的情况下。棘手的部分始终是决定何时消耗了一行以及何时应该再次考虑它。例如,如果您在消费者实际完成其工作之前出现错误,您将需要回滚。但如果该行包含非法数据(如数字字段中的文本),则回滚将变成无限循环。

【讨论】:

【参考方案2】:

通常,SQLite 有显式(不是隐式!)事务。所以你当然需要像“START TRANSACTION”这样的东西,可能是你的Java绑定已经合并了——但好的绑定没有。

因此您可能想要添加必要的事务启动(您的绑定中可能有一个特殊的方法)。

【讨论】:

似乎可以做到;当我执行“BEGIN TRANSACTION”和“END TRANSACTION”SQL 语句而不是使用 JDBC 的提交/回滚函数时,它似乎工作正常。 嗨,Jason,至少您需要 BEGIN TRANSACTION(在某些库中有专门的方法可以做到这一点)。 END TRANSACTION 的结果应该与 COMMIT 相同。 正如 Juergen 所说,begin transaction 方法可以类似于 db.beginTransaction();

以上是关于将 sqlite 用于数据库队列的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

FMDatabase 锁定,类内使用的最佳实践

将数据库与消息队列解耦的最佳实践

使用 SQLite3 + Node.js 的最佳实践

缓冲要在 UART 上发送的数据的最佳实践 [关闭]

[转]Android ORM系列之GreenDao最佳实践

iPhone 上的最佳 SQLite 实践 [关闭]