Thứ Bảy, 10 tháng 8, 2013

Tại sao lại chỉ có một SessionFactory trong application context ?


Ở đây mình nói đến SessionFactory quản lý bởi Spring framework. Nhưng câu hỏi và câu trả lời tương tự cũng có khi Hibernate quản lý SessionFactory.

Câu trả lời ngắn gọn là để đảm bảo performance của ứng dụng. 

Câu trả lời chi tiết thì như sau:

SessionFactory là đối tượng chứa các thông tin quan trọng để thực hiện tạo kết nối đến database như: mapping, data source, các connection information khác... Do đó việc tạo đối tượng này rất tốn công. Đây chính là lý do chỉ có một session factory cho một application.

Để đảm bảo session factory chỉ được tạo ra một lần, các kỹ sư thiết kế đã sử dụng singleton pattern. Session factory còn là một đối tượng sử dụng chung trong toàn bộ application nên các kỹ sư cũng thiết kế để đảm bảo instance của nó là thread-safe. Nhưng session - đối tượng bạn lấy ra từ session factory lại là non-thread-safe.

Mở rộng chút:

Có thể application của bạn cần thao tác với nhiều database, điều này dẫn đến bạn cần nhiều data source. Khi đó bạn sẽ phải cần nhiều hơn một session factory nhưng dù gì thì bạn luôn chỉ tạo mỗi session factory một lần trong suốt chương trình Với Spring, Session factory sẽ được tạo ra ngay trong quá trình khởi động spring container. Đây là tính năng pre-installed cho các bean mà nằm dưới sự quản lý của spring (Session factory cũng chỉ là một bean nằm trong spring container). Tính năng này đảm bảo chuẩn bị tất cả các điều kiện cần thiết để chương trình của bạn hoạt động.

Bất cứ lúc nào bạn cần thao tác với database, bạn đều cần một tham chiếu đến Session factory. Từ session factory sẽ rút ra được session và qua session, bạn mới có thể thao tác với database. Thiết kế tốt cần đảm bảo mọi thao tác với database chỉ nên thực hiện tại tầng DAO - Data Access Object.

Tóm lại: Bạn chỉ có một session factory cho mỗi application và có một session cho từng client cần sử dụng database.

Không có nhận xét nào:

Đăng nhận xét