使用JDBC和多个Lucene存储的全局事务

时间:2014-04-10 14:59:22

标签: scala jdbc transactions lucene

情况如下:1应用程序更新触发2件事:

  1. 插入包含在单个事务中的关系数据库
  2. 表示每个Lucene索引目录
    1. 写索引
    2. 提交
  3. 目标情况是:每当上述任何步骤失败时,一切都应该回滚。应用程序代码在Scala中,作为独立应用程序运行(没有应用程序服务器)。

    解决这个问题的方法应该是什么? JTA?如果是这样,你知道任何接近上述情况的例子吗?

    提前致谢! 罗尔夫

1 个答案:

答案 0 :(得分:1)

您可以实现所需的回滚功能,但是您无法实现原子性。 如果你不介意,请点击下面的伪代码:

// your db connection should have autocommit=off at this point
try {
  preparedStatement.executeQuery(...);

  indexWriter1.addDocument(...);
  indexWriter2.addDocument(...);

  indexWriter1.prepareCommit();
  indexWriter2.prepareCommit();
  // at this point, chances of Lucene failing are pretty slim
  // the only thing left for Lucene now is to rename the segments file

  dbConnection.commit();      
  // if the DB connection commit fails, rollback Lucene writers below

  indexWriter1.commit();
  indexWriter2.commit();
} catch (Throwable t) {
  indexWriter1.rollback();
  indexWriter2.rollback();

  dbConnection.rollback();
}

有关Lucene处理提交结束的更多详细信息,请参阅this thread