繁体   English   中英

Java Hibernate会话及其范围?

[英]Java Hibernate session and its scope?

我刚刚开始将Hibernate与HSQLDB结合使用。 在教程中,他们告诉我不要使用反模式“每次操作会话”。 但是,每次提交事务时,会话也会关闭。 如果commit()关闭会话,我应该如何避免使用getCurrentSession()

我对人们通常如何处理会议范围感到好奇。 我在构建Web应用程序时看到了几个示例,其中每个请求一个会话。 就我而言,我正在构建服务,因此无法应用相同的想法。 该服务运行24/7,偶尔会执行一些数据库操作。 我应该始终保持数据库会话是活动的,只使用事务作为操作之间的边界(考虑我的事务提交不关闭会话的情况)或者我应该为每个操作创建一个新的(这是反...模式,但如何?)。

提前致谢!

该行为由正在使用的CurrentSessionContext的实现决定。 默认碰巧是ThreadLocalSessionContext ,它会在提交时关闭,但是您绝不会受限于此。

您可以通过在适当的生命周期的开始和结束时使用ManagedSessionContext并绑定/取消绑定会话来配置/构建所需的任何类型的会话范围。 您似乎有意义的是,您将条目中的会话绑定到服务的工作单元,并在出口处解除绑定。 (为此,构建健壮的代码当然不是一件容易的事。尤其要记住,如果从其中一种方法中产生异常,则应该进行新的Session 。)


对评论的回应太大了,无法发表评论。

这是默认行为,因为这是唯一“安全”的事情,无需用户提供额外的工作或配置。 如果您不帮忙,那么“提交”是Hibernate能够“看到”的唯一生命周期点,因此它必须在此关闭,否则可能会导致会话永远悬而未决。

确定潜在的会话生命周期边界需要对您实际执行的操作有相当多的了解。 “这是一项后台服务”没什么可继续的。 假设它像闲坐一样每隔X分钟醒来,做一些工作,然后再入睡X分钟,那么打开然后关闭会话将是一个很好的界限。

当谈论“每次操作的会话”是一种反模式时,您可能会使用“操作”的广泛定义。

他们的意思是不要做(像你的服务的虚构要求):

  1. 叫醒服务
  2. 公开会议
  3. 从数据库中读取文件位置
  4. 关闭会话
  5. 打开文件
  6. 公开会议
  7. 从当前文件状态更新数据库表
  8. 关闭会话
  9. 公开会议
  10. 将活动日志写入数据库
  11. 关闭会话
  12. 睡眠服务

在一个会话中执行此操作然后在结束时关闭它是完全合理的。 在单线程环境中,您可以在已知边界内自行管理所有内容,您可以自己打开和关闭会话,而无需使用currentSession 您只需要确保在发生异常时关闭它。 如果您正在侦听操作系统事件,则事件处理将是会话的理想范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM