将sqlite用于数据库队列的最佳实践
我正在使用sqlite数据库作为生产者-消费者队列 一个或多个生产者使用新的自动递增主键一次插入一行 有一个消费者(用java实现,使用库),我希望它读取一批行并删除它们。似乎我需要事务来完成这项工作,但尝试将SQLite与事务一起使用似乎不起作用。我是不是想得太多了 如果我最终需要事务,那么在Java中正确的方法是什么将sqlite用于数据库队列的最佳实践,sqlite,jdbc,transactions,Sqlite,Jdbc,Transactions,我正在使用sqlite数据库作为生产者-消费者队列 一个或多个生产者使用新的自动递增主键一次插入一行 有一个消费者(用java实现,使用库),我希望它读取一批行并删除它们。似乎我需要事务来完成这项工作,但尝试将SQLite与事务一起使用似乎不起作用。我是不是想得太多了 如果我最终需要事务,那么在Java中正确的方法是什么 Connection conn; // assign here boolean success = false; try { // do stuff
Connection conn;
// assign here
boolean success = false;
try {
// do stuff
success = true;
}
finally
{
if (success)
conn.commit();
else
conn.rollback();
}
有关Java JDBC事务处理的介绍,请参阅
至于您的用例,我认为您应该使用事务,特别是当消费者很复杂时。棘手的部分总是决定一行何时被使用,以及何时应该再次考虑它。例如,如果在使用者实际执行其工作之前发生错误,则需要回滚。但是,如果行包含非法数据(如数字字段中的文本),则回滚将变成无限循环。通常,使用SQLite时存在显式(而不是隐式)事务。所以您需要类似于“启动事务”的东西,当然,您的Java绑定可能已经合并了它——但是好的绑定没有
因此,您可能需要添加必要的事务开始(您的绑定中可能有一个特殊的许可方法)。这似乎可以做到;当我执行“BEGIN TRANSACTION”和“END TRANSACTION”SQL语句而不是使用JDBC的提交/回滚函数时,它似乎工作正常。嗨,Jason,至少您需要BEGIN TRANSACTION(在某些LIB中,有专门的方法来执行)。END TRANSACTION的结果应该与COMMIT相同。正如Juergen所指出的,begin TRANSACTION方法可以类似于
db.beginTransaction()代码>