2012-04-09 25 views
18

Tôi hơi bối rối giữa hai người. Theo tôi biết cả hai trả về phiên ngủ đông, SessionFactory.getCurrentSession() trả về một phiên theo ngữ cảnh dựa trên thuộc tính <property name="current_session_context_class"> được đặt trong hibernate.cfg.xml Chúng ta không nên luôn đi theo phương pháp này?Sự khác biệt b/w Hibernate's Sessionfactory.getCurrentSession() và SessionFactory.openSession()

Giá trị bổ sung nào được thêm bởi SessionFactory.openSession()?

Trả lời

37

Phiên được mở mỗi khi sf.getCurrentSession() được gọi lần đầu tiên. Điều này tạo ra một phiên mới hoàn toàn nếu một phiên không tồn tại hoặc sử dụng phiên hiện tại nếu phiên bản đã tồn tại.

Trong Tomcat, việc này liên kết phiên với chuỗi được tạo bằng đối tượng ThreadLocal bên dưới. Nhưng kể từ khi Tomcat sử dụng thread pooling hoàn toàn có thể là một yêu cầu có thể nhận được một thread với một phiên đã được liên kết với nó, do đó giới thiệu khả năng thậm chí không tạo ra một phiên mới. Một điều nữa là Phiên mà bạn đã nhận được với sf.getCurrentSession() bị xóa và đóng tự động.

Mặt khác, phương pháp sf.openSession() tạo phiên mới nhưng không cố gắng liên kết phiên đó với một chuỗi. Nhưng hãy nhớ rằng sf.openSession() giới thiệu một lỗi khác ở chỗ nó mong đợi người dùng xử lý việc đóng và xóa các phiên, thay vì để Hibernate tự động làm điều đó cho chúng ta.

sf.getCurrentSession() thường là đủ. sf.openSession() cung cấp và tạo điều kiện cho một cấp quản lý lớn hơn về nơi phiên được lưu trữ và quản lý. Đó chắc chắn là một lựa chọn nâng cao.

+1

Điều đó có nghĩa rằng nếu tôi đang sử dụng sf.getCurrentSession cho đa luồng bên trong tomcat - nó sẽ sử dụng cùng một phiên? Là nó ổn? – Dejell

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