Vla*_*hev 10

单一会话.当您需要执行一组操作(如对话框OK按钮后更新数据)时启动事务,最后提交tx.虽然连接是连续打开的(因为它是相同的会话),因此Hib和RDBMS都可以使用所有缓存机会.

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

更新

Jens Schauder提供了使用多个会话的原因:会话的部分(不需要的)更新.那么,这取决于你使用Hibernate的方式.

假设我们打开了两个对话框(如Jens的博客示例中所示).如果用户点击radiobox,我们立即更新与此radiobox关联的Hibernate实体,那么,当用户单击Cancel时,我们遇到了麻烦 - 会话已经更新.

正如我所看到的,正确的方法是仅更新对话框变量(非Hibernate对象).然后,当用户单击OK时,我们开始一个事务,合并更新的对象,提交事务.没有垃圾被保存到会话中.

MyHibernateUtils.begin();
Settings settings = DaoSettings.load();
// update setttings here
DaoSettings.save(settings);
MyHibernateUtils.commit(); 
Run Code Online (Sandbox Code Playgroud)

如果我们实现这种干净的关注分离,我们稍后可以通过简单更改MyHibernateUtils.begin()实现来切换到多个会话.

至于可能的内存泄漏,那么... Transaction.commit()调用Session.flush(),AFAIK也清理缓存.此外,可以通过调用Session.setCacheMode()手动控制缓存策略.