我正在嘗試爲批量查詢爬蟲操作創建抽象。其思想是執行查詢,獲得結果集,併爲每一行執行提交或回滾操作。要求是所有的行都被處理,而不管是否有失敗,並且結果集沒有事先加載到內存中。批量查詢爬蟲操作模式
問題歸結爲在回滾之後無法維護打開的結果集這一事實。根據規範,遊標可保存性在提交時保持不變(使用ResultSet.HOLD_CURSORS_OVER_COMMIT),但不在回滾時保持不變。
一個天真的實現與JTA/JDBC語義,提供兩個擴展點,一個用於指定specifing實際操作的每一行的查詢和一個,會是這樣的:
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進行查詢等等)。
另一種情況是將兩個不同的線程用於查詢和行操作。
你會怎麼做?