我們試圖迭代數據庫中的大量行並將其轉換爲對象。行爲如下:在JDBC/iBatis 3中迭代大型結果集的最佳方法是什麼?
- 結果將按序列號排序,當序列號發生變化時將創建一個新對象。創建的對象將被髮送到外部服務,有時必須等待,然後再發送另一個數據(這意味着下一組數據將不會立即使用)
- 我們已經在iBatis 3中投入了代碼,因此iBatis解決方案將會對我們來說是最好的方法(我們已經嘗試過使用RowBounds,但沒有看到它如何進行迭代)。
- 我們想平衡最小化內存使用量和減少數據庫行程。
- 我們也接受純粹的JDBC方法,但我們希望解決方案能夠在不同的數據庫上工作。
更新1:
- 我們需要儘量少調用DB越好(1次調用將是理想的情況下),同時還防止使用過多內存的應用程序。這種類型的問題有沒有其他解決方案可能是純JDBC或任何其他技術?
UPDATE 2
- 查詢將後端驅動並且將只有1個實例在給定時間執行。
感謝並希望聽到您對此的見解。
1.我有一種感覺,iBatis使用LIMIT/OFFSET,我想這意味着它需要爲每個頁面打對數據庫? 2.我們在Java端進行分組,因此不需要在查詢中使用group by關鍵字,我們只需要將結果按id排序,這樣我們就可以在處理之前完成使用相同id的子項創建一個對象下一個對象。 3.您的adhoc分頁聽起來像是RowBounds方法的一個很好的選擇。這樣我們保證只有下一個對象會被檢索。我會給你一個嘗試和檢查性能。 感謝您的幫助leonbloy! – 2010-04-28 01:56:01
我添加了一個新的要求,即儘可能減少DB往返次數。希望您也可以對更新發表評論。謝謝! – 2010-04-28 10:36:50
我堅持要在一個數據庫查詢中這樣做,看看RowHandler或ResultHandler - (或者更加異常地,返回一個ResultSet/Cursor - 或者還原爲普通的JDBC)。但是,如果爲每個「對象」遠程完成的動作應該給出響應(快速 - 不依賴於某些人爲交互),並且您可以相信循環將完成,那麼這是合理的。 – leonbloy 2010-04-28 13:36:16