Bạn muốn chiến lược quản lý phiên cho phép ứng dụng của bạn hoạt động hiệu quả và tận dụng những thứ NHibernate cung cấp cho bạn - đáng chú ý nhất là bộ nhớ đệm và tải chậm. Tạo các phiên là một quá trình không tốn kém và đòi hỏi ít RAM hoặc CPU trước, vì vậy bạn không nên lo lắng về việc bảo tồn hoặc sử dụng lại phiên (thực tế, việc sử dụng lại chúng có thể dẫn đến một số mặt khó chịu và không được dự đoán trước). - hiệu ứng). Nhà máy phiên là thứ đắt tiền và nên được xây dựng một lần và chỉ một lần khi khởi động ứng dụng.
Quy tắc chung là: thời lượng phiên cần đủ dài để bạn không có đối tượng liên tục bị treo trong phạm vi sau khi phiên kết thúc. Sau khi phiên kết thúc, tất cả thay đổi theo dõi đối tượng bạn nhận được từ phiên đó sẽ dừng lại, vì vậy những thay đổi đó sẽ không được lưu trừ khi bạn cố tình đính kèm lại đối tượng đó vào phiên mới. Do đó, phiên nên có khoảng chừng nào các đối tượng bạn tìm nạp từ nó sẽ tồn tại. Trong một ứng dụng Web, điều đó thường có nghĩa là một phiên cho mỗi yêu cầu; trong WinForms, một phiên cho mỗi biểu mẫu.
Trong trường hợp của bạn, với dịch vụ (Tôi cho rằng nó đang chạy là dịch vụ Windows) làm công việc NHibernate, bạn có thể xem xét việc tạo phiên cho mỗi yêu cầu mới từ ứng dụng dành cho máy tính để bàn tiêu thụ và xử lý nó khi yêu cầu đó được phục vụ. Không biết chính xác dịch vụ của bạn chạy như thế nào và ứng dụng máy tính để bàn nào sử dụng để nói chuyện với nó (từ xa? WCF? SOAP cũ?) Tôi thực sự không thể cụ thể hơn.
(Có một số ngoại lệ đối với quy tắc chung này - giả sử bạn có một tập hợp các đối tượng liên tục đại diện cho tài nguyên được chia sẻ mà mã khác sẽ tham chiếu nhưng không thay đổi, bạn có thể tải những thứ này ở đầu ứng dụng chúng bị ngắt kết nối từ đó trở đi.)
Nếu bạn thấy hiệu suất chậm chạp trong chiến lược như vậy, có thể bạn chỉ đang nói chuyện với cơ sở dữ liệu quá nhiều và đồ thị đối tượng của bạn phức tạp; xem second-level caching trong trường hợp này.
Nguồn
2010-01-06 15:00:53
Trong câu hỏi của bạn http://stackoverflow.com/questions/2011950/nhibernate-mappings-issue-when-referencing-class-lazy-load-issue bạn đã yêu cầu tôi xem xét câu hỏi mới này, nhưng tôi thấy bạn ' đã nhận được bảo hiểm phong phú rồi. Tôi thứ hai một số ý kiến ở đây, nhưng lưu ý rằng có vẻ như các phiên và giao dịch được xen kẽ trong cuộc thảo luận, trong khi đó là những thứ khác nhau. Ngoài ra, một phiên nhóm hoặc phiên khởi động được kích hoạt có thể mang lại lợi ích về mặt hiệu suất, nhưng khó thiết lập và có quyền. Cũng lưu ý rằng tính năng tổng hợp kết nối được sử dụng không phụ thuộc vào mẫu bạn đã chọn. – Abel
Cảm ơn bạn đã bình luận Abel. Trong ví dụ, tôi đã thấy các phiên và giao dịch thường chia sẻ cùng một thời gian, nhưng như đã thấy trong câu hỏi được tham chiếu, điều này đôi khi có thể là vấn đề .. Tôi hy vọng mọi người đã trả lời "phiên đời" - không phải "giao dịch trọn đời", ấn tượng rằng đây là trường hợp. – stiank81