2012-01-04 33 views
23

Tôi vừa cập nhật để Hibernate 4.0 và đang nhìn thấy những thông điệp cảnh báo:Cảnh báo HHH000387 Hibernate có nghĩa là gì?

HHH000387: ResultSet's statement was not registered

trong các tập tin đăng nhập của tôi. Điều này có nghĩa là gì và tôi có nên lo lắng không?

+2

Tôi cũng muốn biết câu trả lời cho câu hỏi này. –

Trả lời

1

Tôi sẽ không lo lắng quá nhiều. Trong mọi trường hợp, có vẻ như nó không nằm trong tay người dùng API để tránh thông báo này. Việc ghi nhật ký được thực hiện trong org.hibernate.engine.jdbc.internal.JdbcResourceRegistryImpl. Theo documentation:

Chức năng chính của JdbcResourceRegistry là đảm bảo tài nguyên được dọn sạch.

nhìn ngắn vào mã bảo, rằng một thông điệp được ghi lại trong hai trường hợp:

  1. ResultSet được đăng ký thông qua đăng ký, phương pháp, và tuyên bố không được đăng ký.
  2. ResultSet được phát hành thông qua phương thức phát hành và tuyên bố không được đăng ký.
1

Nhìn vào nguồn cho lớp JdbcResourceRegistryImpl ném lỗi này, cá nhân tôi nghĩ rằng việc ghi nhật ký ở mức WARN quá mức; nó sẽ là INFO nhiều nhất, trừ khi có một cách để có tất cả Statement s được đăng ký ngầm như là một phần của cấu hình Hibernate/framework.

Không rõ ràng tại sao một số Statement nên được đăng ký, nhưng nếu nó chỉ là một mối quan tâm của hoạt động bên trong của Hibernate thì thường xuyên cảnh báo người dùng API về nó là một lỗi, phải không?

1

Thông báo tường trình này là dấu hiệu cho thấy ResultSet.getStatement() không trả lại Statement ban đầu được yêu cầu tạo ResultSet. (Nó cũng có thể biểu thị rò rỉ bộ nhớ.) Điều này có thể xảy ra khi sử dụng trình bao bọc JDBC, vì có hai đối tượng Statement: một trình bao bọc/trang trí và lớp cơ bản Statement.

Trong dự án của tôi, tôi có trình bao bọc JDBC của riêng tôi để thử nghiệm. Tôi đã khắc phục cảnh báo này trong trình bao bọc ResultSet của mình bằng cách đảm bảo rằng getStatement() trả lại số Statement proxy ban đầu (không proxy mới), thay vì ủy quyền cho số ResultSet cơ bản (sẽ trả lại số Statement cơ bản).

Bất kỳ trình bao bọc JDBC nào đang tạo cảnh báo tương tự có thể có thể sử dụng sửa lỗi tương tự. (. Một vấn đề tương tự và sửa chữa có thể áp dụng đối với phương pháp Statement.getConnection())

Bằng cách này, có một báo cáo lỗi cho khai thác gỗ này ở đây: https://hibernate.atlassian.net/browse/HHH-8210

0

Bạn có cấu hình kết nối hồ bơi? Tôi có cùng cảnh báo. Nhưng nếu tôi thêm c3p0 vào phụ thuộc maven của tôi và làm cho nó được cấu hình đúng trong hibernate.cfg.xml. Cảnh báo biến mất.

0

Trong trường hợp của tôi, cảnh báo này là một chỉ báo về rò rỉ hiệu suất rất lớn! Tôi có các đối tượng POJO hibernate với ánh xạ @oneToOne. Đối với một bảng nó hoạt động tốt và không có cảnh báo: nó sẽ gửi một yêu cầu đến máy chủ MySQl để nhận tất cả các bản ghi và sau đó cho một yêu cầu cho mỗi bảng được nối. Đối với POJO nơi tôi nhận được lỗi này (khi không tìm thấy @oneToOne): nó gửi một yêu cầu ban đầu để nhận danh sách tất cả các đối tượng và sau đó mỗi lần gửi yêu cầu mới và mới cho các bảng được ánh xạ cho mỗi bản ghi.

Vì vậy, giả sử tôi có 2000 bản ghi trong DB thử nghiệm của mình. Và 3 @oneToOne ánh xạ các bảng.

Trong trường hợp tốt, nó sẽ gửi 1 yêu cầu để nhận danh sách và 3 yêu cầu nhận bảng được ánh xạ.

Trong trường hợp cảnh báo, nó sẽ gửi 1 yêu cầu ban đầu để nhận danh sách. Sau đó gửi 3 yêu cầu để nhận thông tin bản đồ cho mỗi 2000 bản ghi trong DB! Vì vậy, 1999 * 3 = 5997 yêu cầu bổ sung cho mỗi người dùng cho mỗi cuộc gọi @Controller (Spring MVC).

Tôi đã không nhận thấy điều đó trong khi ứng dụng web và máy chủ MySQL trên cùng một máy chủ.

Các vấn đề liên quan