【问题标题】:Pattern for batch query crawler operations批量查询爬虫操作的模式
【发布时间】:2012-10-19 14:53:57
【问题描述】:

我正在尝试为批量查询爬虫操作创建抽象。这个想法是执行查询,获得结果集,并为每一行执行提交或回滚的操作。要求是所有行的处理与是否存在故障无关,并且结果集没有预先加载到内存中。

问题归结为在回滚后无法维护打开的结果集。根据规范,游标可保持性在提交时可维护(使用 ResultSet.HOLD_CURSORS_OVER_COMMIT),但在回滚时不可维护。

一个带有 JTA/JDBC 语义的简单实现,提供两个扩展点,一个用于指定查询,一个用于指定每一行的实际操作,如下所示:

UserTransaction tx = getUserTransaction();
tx.begin();
ResultSet rs = executeQuery(); //extension point
tx.commit();
while(rs.next()) {
    tx.begin();
    try {
        performOperationOnCurrentRow(ResultSet rs); //extension point
        tx.commit();
        logSuccess();
    }catch(Exception e) {
        tx.rollback();
        logFailure(e);
    }
}

这似乎不是一个牵强附会的场景,但是我在网络上发现的相关信息非常少。问题是,任何流行的框架都优雅地解决了这个问题吗?我不一定需要开箱即用的解决方案,我只是想知道是否有一种已知的良好/普遍接受的方法来处理这种情况。

一种解决方案是跟踪失败的行并在该点之后重新打开游标,这通常需要强制执行一些扩展规则(例如,有序结果集、在 where 子句中使用最后失败的行 ID 进行查询等)。

另一种方法是使用两个不同的线程进行查询和行操作。

你会怎么做?

【问题讨论】:

    标签: java jdbc batch-file jta


    【解决方案1】:

    由于这个问题已经好几年没有回答了,我会继续自己回答。

    我们制定的解决方案围绕着这样一个想法,即进程(称为BatchProcess)执行Query(不限于SQL,请注意)并将其结果添加到并发QueueBatchProcess 产生许多 QueueProcessor 对象(在新线程上运行),它们使用 Queue 的条目并执行使用该条目作为输入的 Operation。每个Operation 执行都作为一个工作单元执行。底层事务管理器是一个 JTA 实现。

    有点过时了,但在某些时候实现是这样的https://bo2.googlecode.com/svn/trunk/Bo2ImplOpen/main/gr/interamerican/bo2/impl/open/runtime/concurrent/BatchProcess.java

    该仓库中的某处甚至还有一个用于 BatchProcess 监控和管理的 GUI ;)

    免责声明:这个人与这个设计和实现有很多关系https://stackoverflow.com/users/2362356/nakosspy

    【讨论】:

      猜你喜欢
      • 2019-11-07
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      相关资源
      最近更新 更多