将 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 用于数据库队列的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章