2008-11-06 49 views
7

Bạn làm cách nào để quản lý phiên Hibernate trong ứng dụng Java Desktop Swing? Bạn có sử dụng một phiên duy nhất không? Nhiều phiên?Quản lý phiên sử dụng Hibernate trong ứng dụng Swing

Dưới đây là một vài tài liệu tham khảo về đề tài này:

Trả lời

10

Độc phiên. Bắt đầu giao dịch khi bạn cần thực hiện một tập hợp các hoạt động (như cập nhật dữ liệu sau hộp thoại OK), cam kết tx ở cuối. Kết nối mặc dù là liên tục mở (vì nó là cùng một phiên), và do đó tất cả các cơ hội cho bộ nhớ đệm có thể được sử dụng bởi cả Hib và RDBMS. Nó cũng có thể là một ý tưởng tốt để thực hiện một phiên minh bạch mở lại trong trường hợp kết nối đã chết - người dùng có xu hướng để các ứng dụng mở trong thời gian dài, và nó sẽ tiếp tục hoạt động hôm thứ hai ngay cả khi máy chủ DB đã được khởi động lại vào cuối tuần.

Cập nhật

Jens Schauder cung cấp một lý do để sử dụng nhiều phiên: một phần (không mong muốn) cập nhật phiên. Vâng, điều đó đi theo cách bạn sử dụng Hibernate.

Giả sử chúng tôi có hai hộp thoại đang mở (như trong ví dụ blog của Jens). Nếu người dùng nhấp vào một hộp phát thanh và chúng tôi sẽ cập nhật ngay lập tức một thực thể Hibernate được kết hợp với hộp radio này, khi người dùng nhấp vào Hủy, chúng tôi đang gặp sự cố - phiên đã được cập nhật.

Cách đúng, như tôi thấy, là cập nhật các biến đối thoại (các đối tượng không có Hibernate). Sau đó, khi người dùng nhấp vào OK, chúng tôi bắt đầu một giao dịch, hợp nhất các đối tượng được cập nhật, cam kết giao dịch. Không có rác nào được lưu vào phiên.

MyHibernateUtils.begin(); 
Settings settings = DaoSettings.load(); 
// update setttings here 
DaoSettings.save(settings); 
MyHibernateUtils.commit(); 

Nếu chúng tôi thực hiện việc tách biệt mối quan tâm, sau này chúng tôi có thể chuyển sang nhiều phiên với thay đổi đơn giản MyHibernateUtils.begin().

Đối với rò rỉ bộ nhớ có thể, cũng ... Transaction.commit() gọi Session.flush(), AFAIK, cũng xóa bộ nhớ cache. Ngoài ra, người ta có thể kiểm soát thủ công chính sách bộ nhớ đệm bằng cách gọi Session.setCacheMode().

4

Không sử dụng một phiên duy nhất. Đối với tất cả mọi thứ nhưng các ứng dụng nhỏ nhất nó sẽ phát triển, thu thập dữ liệu tự động và trở nên chậm hơn và chậm hơn, vì kiểm tra bẩn cần kiểm tra mọi thực thể trong phiên.

Nếu bạn không cần/muốn tải chậm và theo dõi các thay đổi của hibernat, bạn có thể sử dụng các phiên hoạt động ngắn.

Nhưng nếu bạn muốn hưởng lợi từ sức mạnh của Hibernate sử dụng aproach tôi đã mô tả trong blog của tôi: http://blog.schauderhaft.de/2008/09/28/hibernate-sessions-in-two-tier-rich-client-applications/

hoặc trong phiên bản tiếng Đức:

http://blog.schauderhaft.de/2007/12/17/hibernate-sessions-in-fat-client-anwendungen/

AFAIK nó thực sự là cùng một sản phẩm được mô tả trong các http://in.relation.to/Bloggers/HibernateAndSwingDemoApp nhưng với một đề xuất làm thế nào để thực sự phạm vi phiên của bạn: Trên phiên mỗi khung hình, ngoại trừ khung phương thức sử dụng phiên của Khung chính.

Chỉ cần đảm bảo không bao giờ kết hợp các đối tượng từ các phiên khác nhau. Nó sẽ gây ra rất nhiều rắc rối.

Trong thư trả lời để Vladimirs update:

  • Các hủy thực sự hoạt động cực kỳ tốt đẹp với aproach tôi: vứt bỏ phiên.
  • phiên.flush không khắc phục được sự cố của phiên phát triển khi bạn làm việc với một phiên duy nhất cho ứng dụng. Tất nhiên với aproach bạn mô tả bạn có thể làm việc với các phiên sống ngắn mà nên làm việc ok. NHƯNG
  • bạn bị mất rất nhiều: tải chậm chỉ hoạt động với các đối tượng được đính kèm, tự động phát hiện các đối tượng bẩn. Nếu bạn làm việc với các đối tượng tách rời (hoặc các đối tượng không phải là thực thể), bạn phải tự làm điều này.
+0

Điểm tốt, Jens! –

1

Sử dụng một phiên cho mỗi luồng (doc) và cột phiên bản hoặc dấu thời gian để cho phép đồng thời lạc quan và do đó tránh xung đột giữa các phiên. Đính kèm phiên bản vào phiên khi cần, trừ khi bạn cần các giao dịch chạy dài hoặc mức cô lập hạn chế.

+0

Trong ứng dụng xoay về cơ bản, mọi thứ xảy ra trong một chuỗi. Vì vậy, điều này đi xuống đến phiên duy nhất cho ứng dụng, với những hạn chế về tài liệu. –

4

Vấn đề với phiên "" trên mỗi luồng '' "là các ứng dụng Swing tốt thực hiện truy cập cơ sở dữ liệu bên ngoài EDT, thường là trong các chủ đề SwingWorker mới được tạo. Bằng cách này, "'' phiên cho mỗi chủ đề ''" nhanh chóng trở thành "'' phiên cho mỗi nhấp chuột ''".

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