2009-10-19 70 views
0

我一直在我的桌面上使用Hibernate + HSQLDB爲我的應用程序開發數據庫適配器。出於傳統原因,這些ID由應用程序以字符串形式生成。所有工作都很好。休眠無法在大型數據庫上啓動

現在,我們有一個pre-prod數據庫,有超過一百萬條記錄。我不得不在Hibernate方面做一些修改(例如標識符太長),但沒有什麼重要的。

也就是說,直到我解決了這個問題。當我嘗試在預產品服務器上啓動我的應用程序時,Hibernate開始創建一個gazillion查詢,最終結束於OutOfMemoryError:Java堆空間。增加堆最大值沒有幫助。

我禁用了C3PO緩存設置並禁用了hibernate.hbm2ddl.auto。我不知道爲什麼它正在做這些查詢,我不知道如何禁用它們。

任何人都可以幫助我??????

+2

它正在執行什麼樣的查詢? Hibernate不會自行查詢,因爲你的應用程序要求它發佈它們。 – skaffman 2009-10-19 07:58:06

+0

你說得對。我在啓動時做了一個虛擬查詢,以確保我們觸及了數據庫。我刪除了那個,我可以啓動應用程序。但是這只是改變了問題,因爲執行任何DB請求時,gazillion查詢都會執行。 – malaverdiere 2009-10-19 08:33:03

回答

1

你告訴Hibernate熱切地提取。所以當你加載第一個對象時,Hibernate也開始獲取所有相關的對象。

您必須將所有不必要的關係設置爲fetch=LAZY

+0

這很好。我禁用了所有的提取選項(因此讓Hibernate用它的默認設置),我沒有這種情況。 但是,我現在已經阻止了行爲。 :( – malaverdiere 2009-10-19 09:31:21

+0

)你必須找到懶惰和渴望獲取之間的平衡,並且你必須確保你使用了正確的事務嵌套,祝你好運調試這個,我通常會建議測試用例,但很難提出死鎖測試。 – 2009-10-19 09:40:28