2011-02-18 44 views
4

我目前在我的項目中設置了hibernate。它適用於大多數事情。但是今天我需要查詢從表中返回幾十萬行。它是表中總行數的2/3。問題是查詢需要7分鐘。使用直接的JDBC並執行我所假設的是一個相同的查詢,它需要20秒鐘的時間。因此,我認爲我正在做一些完全錯誤的事情。我將在下面列出一些代碼。快速獲取冬眠結果的方法?

DetachedCriteria criteria =DetachedCriteria.forlass(MyObject.class); 
criteria.add(Restrictions.eq("booleanFlag", false)); 
List<MyObject> list = getHibernateTemplate().findByCriteria(criteria); 

任何想法,爲什麼它會很慢和/或我能做些什麼來改變它?

回答

5

您可能已經回答了您自己的問題,請使用直接JDBC。

Hibernate最多爲每行創建一些Object的實例,或者更糟糕的是,爲每行創建多個Object實例。 Hibernate有一些真正退化的代碼生成和實例化行爲,可能難以控制,特別是對於大型數據集,而且如果啓用了任何緩存選項,情況更是如此。

Hibernate不適用於大型結果集,並且處理成千上萬行作爲對象也不是很好的性能導向。

原始JDBC只是行列的原始類型。數據量少的訂單。

+0

我只是不確定hibernate是否有能力做到這一點,我只是不正確地使用它。感謝您的直接JDBC將是適當的解決方案的信心。 – Joseph 2011-02-22 15:45:45

1

也許你有幾個對你的MyObject類中的其他類的引用,並且在你的映射中你設置了急切的加載或類似的東西。使用您編寫的代碼很難找到問題,因爲它沒問題。
也許使用Hibernate Profiler會更好 - http://hibernateprofiler.com/。它會向您顯示映射,配置和查詢的所有問題。

5

我不確定如果需要拉動數十萬條記錄,hibernate是正確的選擇。查詢執行時間可能在20秒以內,但獲取時間會很長並且消耗大量內存。在獲得所有這些記錄後,你如何輸出它們?數據量遠遠超過您向用戶展示的數據量。 Hibernate並不是一個真正的數據倉庫風格數據處理的好方案。