我明白這是一個難題,因爲它不僅取決於hibernate,而且還取決於我們使用它的特定方式。 我們在我們的應用程序中使用hibernate 4,可能是以一種錯誤的方式,但事實就是這樣。Hibernate是否支持併發讀取數據?
所以我們加載一個整體的類層次結構,並在一個大的語句中加入了子類表,並按照我們轉換成對象的150K行的順序。
由於對象有許多字段需要設置(〜100),我們想並行化迭代遍歷結果集並獲取單獨行的循環。這在Hibernate中可能嗎? Hibernate是否已經從DB接收到所有結果並可以使用這些數據來保存對象,因此我們可以使用多線程來加速獲取大型結果集?
這是否有意義,還是更好地更改數據結構和映射以擺脫多表連接?
事實上,加載150K這些對象需要一分鐘或0.3毫秒/實體。我們有更簡單的表和更多的條目,我們在0.02毫秒/實體下加載一個數量級。初始化階段後,我們不會加載其他實體,而整個DB需要5分鐘以上。
如果我們通過將類層次結構忽略到數據庫並切換到基於組合的數據結構來移除連接,那麼我們可能會以多個表加載爲代價獲得更簡單的表加載而不是複雜的連接,負荷組合爲一體。
但問題仍然存在:如果我們有這麼多行加載,並因此需要填寫每個對象的字段時調用很多setter,這可以並行嗎?
好並行獲取策略是一種可能性,但恕我直言,你會增加系統的複雜性。同樣在這一刻,很難判斷這種解決方案的可擴展性。我的建議是(如果你有時間的話)審查數據對象並消除不需要的連接和數據。 – bornleo