2008-11-06 138 views

回答

10

单个会话。当您需要执行一组操作时(例如,在对话框确定按钮后更新数据),开始事务,最后提交tx。虽然连接不断打开(因为它是同一会话),因此Hib和RDBMS都可以使用所有缓存机会。

在连接失效的情况下实现透明会话重新打开也许是个好主意 - 用户倾向于让应用程序长时间打开,即使数据库服务器在星期一应该也会继续工作周末重新启动。

更新

延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(),这AFAIK,也清理缓存。另外,可以通过调用Session.setCacheMode()来手动控制缓存策略。

4

请勿使用单个会话。对于除了最小应用程序之外的所有应用程序,它会增长,收集自动化数据并变得越来越慢,因为脏检查需要检查会话中的每个实体。

如果您不需要/希望延迟加载并通过hibernat跟踪更改,则可以使用短暂会话。

但是,如果你想从休眠的强大功能使用我在我的博客中描述的形式给出: 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/

据我所知这是真的在http://in.relation.to/Bloggers/HibernateAndSwingDemoApp中描述了相同的方法,但提出了如何实际确定会话范围的建议: 关于每个帧的会话,但使用父帧的会话的模式帧除外。

只要确保永远不要组合来自不同会话的对象。这会造成很多麻烦。

在回答Vladimirs更新:

  • 的实际工作取消不错的极端与我的aproach:扔掉了会议。
  • session.flush无法解决您在单个会话中处理应用程序时不断增长的会话问题。当然,按照你所描述的方法,你可以使用短期会话,这应该很好。但是
  • 你失去了很多:懒加载只适用于附加对象,自动检测脏对象。如果你使用分离的对象(或者根本不是实体的对象),你必须自己做这件事。
+0

好点,简斯! – 2008-11-10 15:49:22

1

每个线程使用一个会话(doc)和版本或时间戳列允许乐观并发,从而避免会话间冲突。在需要时将实例附加到会话,除非需要长时间运行的事务或限制性隔离级别。

+0

在一个swing应用程序中,基本上一切都发生在一个线程中。因此,这归结为应用程序的单一会话,文档缺陷。 – 2009-03-15 09:54:09

4

每个线程“'”会话的问题很好Swing应用程序会在EDT之外执行数据库访问,通常是在新创建的SwingWorker线程中。这样,“''每个线程的会话''”很快就会变成'''每次点击的会话''“。

相关问题