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

Jas*_*n S 6 sqlite transactions jdbc

我正在为生产者-消费者队列使用 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();
 }
Run Code Online (Sandbox Code Playgroud)

Aar*_*lla 5

有关使用 Java JDBC 处理事务的介绍,请参阅此线索

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


Jue*_*gen 3

通常,SQLite 存在显式(而非隐式!)事务。因此,您当然需要类似“START TRANSACTION”的内容,您的 Java 绑定可能已合并了此内容,但好的绑定则不会。

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