【问题标题】:best practices for using sqlite for a database queue将 sqlite 用于数据库队列的最佳实践
【发布时间】: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();
 }

【问题讨论】:

    标签: sqlite jdbc transactions


    【解决方案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();
      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 2010-11-02
      • 2013-01-24
      • 1970-01-01
      • 2011-05-14
      • 2019-03-13
      • 1970-01-01
      • 2010-11-06
      相关资源
      最近更新 更多