gpt4 book ai didi

java - 批量查询爬虫操作的模式

转载 作者:行者123 更新时间:2023-11-30 11:39:57 26 4
gpt4 key购买 nike

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

问题归结为这样一个事实,即在回滚后无法维护打开的结果集。这是根据规范,游标可保持性在提交时可维护(使用 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 等进行查询) ).

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

你会怎么做?

最佳答案

由于这个问题已经有几年没有得到解答了,我将继续自己回答。

我们制定的解决方案围绕着进程(称为 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

在那个 repo 的某个地方甚至有一个用于 BatchProcess 监控和管理的 GUI ;)

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

UML diagrams for Batch Process objects

关于java - 批量查询爬虫操作的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12976888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com