2015-05-29 67 views
2

假設,如果我執行一個select查詢(HQL)並且它給出100K行作爲結果。我想知道是否有一種方法來加載Java(或任何其他語言)這些100K的塊在1K塊查詢完成後執行。 我把它分成大塊的原因是 - 我不知道這些100K結果將存儲在哪裏,而我正在用java處理它們。但我想使用較少的內存消耗。加載SELECT查詢的實際數據塊(不再執行相同的查詢)

  1. 執行查詢(與HQL休眠條件)(假設100K行結果)
  2. 挑第一1K在它們(而不JVM的存儲器或某處加載其他99K,如遲緩裝載在休眠
  3. 過程
  4. 從(2)
拾取下一個1K
  • 重複

    更新 - 我不想再次點擊查詢。 要麼我無法理解任何答案,要麼你的人無法理解我的問題

  • +0

    網上有一些很好的參考資料,比如[this one](http://www.numerati.com/2012/06/26/reading-large-result-sets-with-hibernate-and-mysql /)。 –

    +0

    我相信你的意思是說,每當我需要結果時,用下一個計數器打數據庫? – user3104225

    +0

    我的意思是,如果有一種方法來打擊查詢,然後得到結果(主鍵)的指針。並使用這些指針獲得下一組結果(實際數據)。 – user3104225

    回答

    0

    首先在兩個查詢中拆分您的查詢。

    第一個是通過將Select部分更改爲類似於SELECT COUNT(o) FROM Object o的東西來獲得結果集的計數。

    發送是你現有的查詢沒有變化。

    然後首先運行計數查詢請求一個結果。它將直接是Long值與結果大小。

    然後計算出你迭代:

    long pages = Math.ceil(count/1000); 
    

    最後但並非最不重要迭代計算頁面,並通過啓動你的查詢設定偏移,並得到結果之前限制。

    +0

    '首先在兩個查詢中拆分您的查詢。'但是如果兩個查詢之間的數據庫發生變化會發生什麼? –

    +0

    這也可能發生在你沒有分頁的情況下工作在100k記錄的時間;) –

    +0

    把所有的包裝方法,調用他自我遞歸,直到它發現db中沒有任何更改 –

    相關問題