如何在Java桌面Swing应用程序中进行Hibernate会话管理?你使用一次会话吗?多个会话?
以下是有关该主题的一些参考资料:
答案 0 :(得分:10)
单一会话。当您需要执行一组操作(如对话框OK按钮后更新数据)时启动事务,最后提交tx。虽然连接是连续打开的(因为它是同一个会话),因此Hib和RDBMS都可以使用所有缓存机会。
在连接失效的情况下实现透明会话重新打开也是一个好主意 - 用户倾向于长时间保持应用程序打开,即使数据库服务器是周末重启。
<强>更新强>
Jens Schauder提供了使用多个会话的理由:会话的部分(不需要的)更新。那么,这取决于你使用Hibernate的方式。
假设我们打开了两个对话框(如Jens的博客示例中所示)。如果用户点击radiobox,我们立即更新与此radiobox关联的Hibernate实体,那么,当用户点击取消时,我们遇到了麻烦 - 会话已经更新。
正如我所看到的,正确的方法是仅更新对话框变量(非Hibernate对象)。然后,当用户单击OK时,我们开始一个事务,合并更新的对象,提交事务。没有垃圾被保存到会话中。
MyHibernateUtils.begin();
Settings settings = DaoSettings.load();
// update setttings here
DaoSettings.save(settings);
MyHibernateUtils.commit();
如果我们实现这种清晰的关注点分离,我们稍后可以通过简单更改MyHibernateUtils.begin()实现来切换到多个会话。
至于可能的内存泄漏,那么...... Transaction.commit()调用Session.flush(),AFAIK也会清理缓存。此外,可以通过调用Session.setCacheMode()来手动控制缓存策略。
答案 1 :(得分:4)
不要使用单个会话。对于除最小应用程序之外的所有应用程序,它将增长,收集过时的数据并变得越来越慢,因为脏检查需要检查会话中的每个实体。
如果您不需要/希望延迟加载和跟踪Hibernate的更改,您可以使用短期会话。
但是如果你想从Hibernate的强大功能中受益,请使用我在博客中描述的方法: http://blog.schauderhaft.de/2008/09/28/hibernate-sessions-in-two-tier-rich-client-applications/
或德文版:
http://blog.schauderhaft.de/2007/12/17/hibernate-sessions-in-fat-client-anwendungen/
AFAIK它实际上与http://in.relation.to/Bloggers/HibernateAndSwingDemoApp中描述的方法相同,但建议如何实际调整会话范围: 在每帧会话上,除了使用父帧的会话的模态帧。
确保永远不要组合来自不同会话的对象。这会造成很多麻烦。
回复Vladimirs更新:
答案 2 :(得分:4)
每个线程的“''会话'问题”很好Swing应用程序在EDT之外进行数据库访问,通常是在新创建的SwingWorker线程中。这样,“每个线程的'''会话''很快变成'''每次点击会话''”。
答案 3 :(得分:1)
每个线程(doc)和版本或时间戳列使用一个会话以允许乐观并发,从而避免会话到实例冲突。除非您需要长时间运行的事务或限制性隔离级别,否则在需要时将实例附加到会话。