如何在 Java Desktop Swing 应用程序中进行 Hibernate 会话管理?您使用单个会话吗?多次会议?
以下是有关该主题的一些参考资料:
- http://www.hibernate.org/333.html
-
http://blog.schauderhaft.de/2008/09/28/hibernate-sessions-in-two-tier-rich-client-applications/
- http://in.relation.to/Bloggers/HibernateAndSwingDemoApp
单次会议。当您需要执行一组操作(例如在对话框“确定”按钮后更新数据)时启动交易,最后提交交易。不过,连接始终处于打开状态(因为它是同一会话),因此 Hib 和 RDBMS 都可以使用所有缓存机会。
实现透明的会话重新打开可能也是一个好主意,以防连接中断——用户倾向于让应用程序长时间保持打开状态,即使数据库服务器在周末重新启动,它也应该在周一继续工作。
Update
Jens Schauder 提供了使用多个会话的原因:对会话进行部分(不需要的)更新。好吧,这取决于您使用 Hibernate 的方式。
假设我们打开了两个对话框(如 Jens 的博客示例所示)。如果用户单击一个单选框,并且我们立即更新与该单选框关联的 Hibernate 实体,那么,当用户单击“取消”时,我们就会遇到麻烦——会话已经更新。
在我看来,正确的方法是仅更新对话框变量(非 Hibernate 对象)。然后,当用户单击“确定”时,我们开始一个事务,合并更新的对象,提交事务。会话中不会保存任何垃圾。
MyHibernateUtils.begin();
Settings settings = DaoSettings.load();
// update setttings here
DaoSettings.save(settings);
MyHibernateUtils.commit();
如果我们实现这样一个干净的关注点分离,我们稍后可以通过简单更改 MyHibernateUtils.begin() 实现来切换到多个会话。
至于可能的内存泄漏,嗯... Transaction.commit() 调用 Session.flush(),据我所知,它也会清理缓存。此外,还可以通过调用 Session.setCacheMode() 来手动控制缓存策略。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)