我只需要使用Hibernate讀取MySQL數據庫中的表中的每一行並根據它編寫一個文件。但是有9000萬行,它們非常大。因此,它似乎像以下是合適的:使用Hibernate的ScrollableResults緩慢讀取9000萬條記錄
ScrollableResults results = session.createQuery("SELECT person FROM Person person")
.setReadOnly(true).setCacheable(false).scroll(ScrollMode.FORWARD_ONLY);
while (results.next())
storeInFile(results.get()[0]);
的問題是上面會嘗試在移動到while循環之前,所有90個百萬行加載到RAM中......這會殺了我的記憶的OutOfMemoryError :Java堆空間異常:(。
所以我想ScrollableResults不是我在找什麼?處理這個問題的正確方法是什麼?我不介意如果這個while循環需要幾天(好吧我會愛它不)
我想唯一的其他方式來處理這個是使用setFirstResult和setMaxResults遍歷結果,只是我們定期的Hibernate結果而不是ScrollableResults。這感覺就像是效率低下,而且我會在第89萬行調用setFirstResult時開始花費很長時間...
更新:setFirstResult/setMaxResults不起作用,事實證明需要如我擔心的那樣長時間無法抵達偏移。這裏必須有一個解決方案!這不是一個非常標準的程序嗎?我願意放棄Hibernate並使用JDBC或其他方法。
更新2:該解決方案,我想出來的,其工作正常,不是很大,是基本形式:
select * from person where id > <offset> and <other_conditions> limit 1
因爲我有其他的條件下,即使所有的索引,它仍然不是儘快我希望它是...所以仍然打開其他建議..
你也許能夠分割你的數據,所以你不必一次讀取多少,參考:http://stackoverflow.com/questions/8325745/how-to-implement-several-threads-in -java-for-downloading-a-single-table-data/29502316#29502316 – rogerdpack 2015-04-16 21:13:07