2012-01-04 30 views
13

Tôi đang xây dựng một hệ thống, trong đó mỗi yêu cầu từ phía khách hàng sinh ra nhiều luồng trên phía máy chủ. Mỗi thread sau đó được sử dụng một hoặc nhiều DAO (một số DAO có thể được sử dụng bởi nhiều hơn một thread tại thời điểm đó). Tất cả các DAO được tiêm (@Autowired) vào các lớp chủ đề của tôi trước mùa xuân. Mỗi DAO cũng nhận được SessionFactory tiêm.Quản lý phiên Spring + Hibernate qua nhiều chủ đề

Điều gì sẽ là cách thích hợp để quản lý các phiên Hibernate trên nhiều DAO này vì vậy tôi sẽ không gặp sự cố vì môi trường đa luồng (ví dụ: DAO từ nhiều chủ đề khác nhau đang cố gắng sử dụng cùng một phiên tại cùng một thời điểm)?

Đủ để tôi chỉ định hibernate.current_session_context_class=thread trong cấu hình Hibernate và sau đó mọi lúc trong DAO chỉ cần sử dụng SessionFactory.getCurrentSession() để thực hiện công việc? Nó sẽ phát hiện đúng và tạo các phiên cho mỗi luồng khi cần thiết?

Trả lời

15

Có. Đủ rồi.

Khi đặt hibernate.current_session_context_class thành thread, phiên được trả lại từ SessionFactory.getCurrentSession() là từ ví dụ ThreadLocal.

Mỗi chuỗi sẽ có trường hợp riêng, độc lập ThreadLocal, do đó các chuỗi khác nhau sẽ không truy cập vào cùng một phiên ngủ đông.

Hành vi của SessionFactory.getCurrentSession() là: nếu nó được gọi lần đầu tiên trong chuỗi hiện tại, một Phiên mới được mở và trả về. Nếu nó được gọi lại trong cùng một luồng, thì cùng một phiên sẽ được trả về.

Kết quả là bạn có thể sử dụng cùng một phiên để sử dụng trong các phương thức DAO khác nhau trong cùng một mã giao dịch bằng cách gọi SessionFactory.getCurrentSession(). Nó ngăn bạn đi qua phiên Hibernate thông qua các tham số đầu vào của phương thức DAO trong trường hợp bạn phải gọi nhiều phương thức DAO khác nhau trong cùng một mã giao dịch.

+3

Điều gì về việc kết thúc phiên khi công việc được thực hiện, nó có được thực hiện tự động không? – MounirReg

+1

Khi bạn đang Hibernate với Spring 3 hoặc mới hơn, bạn nên tránh thiết lập thuộc tính này vì Spring đã thực hiện riêng của nó về điều này cần thiết cho Spring để quản lý các phiên Hibernate. http://stackoverflow.com/a/18842593/3826713 – UCJava

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