2012-01-04 128 views
23

我剛剛更新到Hibernate 4.0和我看到的警告消息:HHH000387休眠警告是什麼意思?

HHH000387: ResultSet's statement was not registered

在我的日誌文件。這是什麼意思,我應該擔心嗎?

+2

我想知道這個問題的答案。 – 2012-04-11 22:02:22

回答

1

我不會太擔心。無論如何,它看起來不是在API的用戶手中來避免這個消息。日誌記錄在org.hibernate.engine.jdbc.internal.JdbcResourceRegistryImpl中完成。據documentation

一個JdbcResourceRegistry的主要功能是使 得到清理確保資源。

短期看向代碼告訴,這樣的消息在兩種情況下登錄:

  1. 的ResultSet是通過寄存器方法進行註冊,並聲明未註冊。
  2. ResultSet通過發佈方法發佈,並且語句未註冊。
1

查看引發此錯誤的JdbcResourceRegistryImpl類的源代碼,我個人認爲它在WARN級別的日誌過多;它最多應該是INFO,除非有辦法將所有Statement隱式註冊爲Hibernate/framework配置的一部分。

我不清楚爲什麼Statement應該註冊,但如果它只是Hibernate內部工作的一個問題,那麼經常向API用戶發出警告是一個錯誤,對吧?

1

此日誌消息表示ResultSet.getStatement()未返回最初要求創建ResultSetStatement。 (它也可能指示內存泄漏。)使用JDBC包裝器時可能會發生這種情況,因爲有兩個對象:包裝器/裝飾器和底層的Statement

在我的項目中,我有我自己的用於測試的JDBC包裝器。我通過確保getStatement()返回原始Statement代理(一個新的代理),在我的ResultSet包裝這樣的警告,而不是委託給底層ResultSet(這將返回底層Statement)。

任何正在生成類似警告的JDBC包裝器都可能使用類似的修復程序。 (類似的問題並解決,可向法Statement.getConnection()

順便說一句,對於這個記錄在這裏的bug報告:https://hibernate.atlassian.net/browse/HHH-8210

0

你配置的連接池?我有同樣的警告。但是如果我在maven依賴項中添加c3p0,並在hibernate.cfg.xml中正確配置它。警告消失。

0

在我的情況下,這個警告是一個巨大的性能泄漏的指標! 我有@oneToOne映射休眠POJO對象。對於一個表,它工作正常,沒有警告:它向MySQl服務器發送一個請求,以獲取所有記錄,然後爲每個連接的表發送一個請求。 對於出現此錯誤(當沒有找到@oneToOne時)的POJO:它發送一個初始請求以獲取所有對象的列表,然後每次發送針對每條記錄的映射表的新請求和新請求。

因此,假設我的測試數據庫中有2000條記錄。和3 @一對一映射表。

在一個很好的情況下,它發送1個獲取列表的請求和3個獲取映射表的請求。

在發出警告的情況下,它會發送1個獲取列表的初始請求。然後發送3個請求,獲取DB中每個2000記錄的映射信息!因此,對於每個調用@Controller(Spring MVC),每個用戶1999 * 3 = 5997個附加請求。

我沒有注意到它,而Web應用程序和MySQL服務器在同一臺服務器上。

相關問題