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

时间:2009-10-27 14:06:12

标签: sqlite jdbc transactions

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

一个或多个生产者使用新的自动增量主键一次INSERT一行。

有一个使用者(在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();
 }

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

所以你可能想要添加必要的事务开始(你的绑定中可能有一个特殊的方法)。