我剛剛更新到Hibernate 4.0和我看到的警告消息:HHH000387休眠警告是什麼意思?
HHH000387: ResultSet's statement was not registered
在我的日誌文件。這是什麼意思,我應該擔心嗎?
我剛剛更新到Hibernate 4.0和我看到的警告消息:HHH000387休眠警告是什麼意思?
HHH000387: ResultSet's statement was not registered
在我的日誌文件。這是什麼意思,我應該擔心嗎?
我不會太擔心。無論如何,它看起來不是在API的用戶手中來避免這個消息。日誌記錄在org.hibernate.engine.jdbc.internal.JdbcResourceRegistryImpl中完成。據documentation:
一個JdbcResourceRegistry的主要功能是使 得到清理確保資源。
短期看向代碼告訴,這樣的消息在兩種情況下登錄:
查看引發此錯誤的JdbcResourceRegistryImpl
類的源代碼,我個人認爲它在WARN級別的日誌過多;它最多應該是INFO,除非有辦法將所有Statement
隱式註冊爲Hibernate/framework配置的一部分。
我不清楚爲什麼Statement
應該註冊,但如果它只是Hibernate內部工作的一個問題,那麼經常向API用戶發出警告是一個錯誤,對吧?
此日誌消息表示ResultSet.getStatement()
未返回最初要求創建ResultSet
的Statement
。 (它也可能指示內存泄漏。)使用JDBC包裝器時可能會發生這種情況,因爲有兩個對象:包裝器/裝飾器和底層的Statement
。
在我的項目中,我有我自己的用於測試的JDBC包裝器。我通過確保getStatement()
返回原始Statement
代理(不一個新的代理),在我的ResultSet
包裝這樣的警告,而不是委託給底層ResultSet
(這將返回底層Statement
)。
任何正在生成類似警告的JDBC包裝器都可能使用類似的修復程序。 (類似的問題並解決,可向法Statement.getConnection()
)
順便說一句,對於這個記錄在這裏的bug報告:https://hibernate.atlassian.net/browse/HHH-8210
你配置的連接池?我有同樣的警告。但是如果我在maven依賴項中添加c3p0,並在hibernate.cfg.xml中正確配置它。警告消失。
在我的情況下,這個警告是一個巨大的性能泄漏的指標! 我有@oneToOne映射休眠POJO對象。對於一個表,它工作正常,沒有警告:它向MySQl服務器發送一個請求,以獲取所有記錄,然後爲每個連接的表發送一個請求。 對於出現此錯誤(當沒有找到@oneToOne時)的POJO:它發送一個初始請求以獲取所有對象的列表,然後每次發送針對每條記錄的映射表的新請求和新請求。
因此,假設我的測試數據庫中有2000條記錄。和3 @一對一映射表。
在一個很好的情況下,它發送1個獲取列表的請求和3個獲取映射表的請求。
在發出警告的情況下,它會發送1個獲取列表的初始請求。然後發送3個請求,獲取DB中每個2000記錄的映射信息!因此,對於每個調用@Controller(Spring MVC),每個用戶1999 * 3 = 5997個附加請求。
我沒有注意到它,而Web應用程序和MySQL服務器在同一臺服務器上。
我想知道這個問題的答案。 – 2012-04-11 22:02:22