2012-10-19 34 views
2

我正在嘗試爲批量查詢爬蟲操作創建抽象。其思想是執行查詢,獲得結果集,併爲每一行執行提交或回滾操作。要求是所有的行都被處理,而不管是否有失敗,並且結果集沒有事先加載到內存中。批量查詢爬蟲操作模式

問題歸結爲在回滾之後無法維護打開的結果集這一事實。根據規範,遊標可保存性在提交時保持不變(使用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進行查詢等等)。

另一種情況是將兩個不同的線程用於查詢和行操作。

你會怎麼做?

回答

1

由於這個問題現在還沒有得到解答,所以我會繼續自己回答。

我們制定的解決方案圍繞着這個過程(稱爲BatchProcess)執行Query(不限於SQL,介意您)並將其結果添加到併發Queue的想法。 BatchProcess會產生若干使用Queue條目的QueueProcessor對象(在新線程上運行),並執行使用該條目作爲輸入的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

UML diagrams for Batch Process objects