getCurrentSession 在网络中休眠

2024-05-14

我正在使用 hibernate 和 jsp/servlet 编写一个基于 Web 的应用程序。我读过有关sessionFactory.getCurrentSession and sessionFactory.openSession方法。我知道它们之间的基本区别(使用getCurrentSession您不必关闭连接,当您提交事务时,您的会话将自动关闭)。根据我的理解,我们应该选择getCurrentSession并通过每个请求的会话来完成。

让我们考虑以下场景:

  1. 方法A调用getCurrentSession并获取当前会话
  2. 在方法 A 中,使用步骤 1 中的会话启动事务
  3. 方法A调用方法B,方法B也有getCurrentSession并开始交易
  4. 方法 B 提交其事务
  5. 控制返回到方法 A 并且它还提交事务

现在我的问题是

  1. 步骤 1 和步骤 3 中找到的会话是否是同一个会话?
  2. 如果问题 1 的答案是肯定的,那么它将如何处理步骤 4 中的提交?理想情况下,它应该自行关闭会话,并在第 5 步抛出异常。
  3. 如果问题1的答案是否定的,那么您如何处理这种情况?

步骤 1 和步骤 3 中找到的会话是否是同一个会话?

它们应该是相同的,这在某种程度上是合同的一部分getCurrentSession()你会得到Session只要工作单元尚未完成(即事务已提交或回滚),就绑定到线程。Java 与 Hibernate 的持久性是这样说的(第 481 页):

所有调用的数据访问代码getCurrentSession()关于全球共享SessionFactory获得相同的电流Session— 如果它被调用在 同一个线程。工作单元完成时Transaction已提交(或回滚)。 Hibernate 还会刷新并关闭当前的Session及其持久化上下文(如果您提交或回滚事务)。这里的含义是调用getCurrentSession()提交或回滚后产生新的Session和一个新的持久性上下文。

您可能还想阅读 javadoc 的内容Session#beginTransaction() http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html#beginTransaction() says.

如果问题 1 的答案是肯定的,那么它将如何处理步骤 4 中的提交。理想情况下,它应该自行关闭会话,并在步骤 5 中给出错误。

第4步应该没有问题,Session将被冲洗,Transaction将致力于并Session关闭。但我预计第 5 步会失败TransactionException http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/TransactionException.html(这是我的赌注)。但让我引用javadocTransaction http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Transaction.html:

事务与会话相关联,通常通过调用来实例化Session.beginTransaction()。单个会话可能跨越多个事务,因为会话的概念(应用程序和数据存储之间的对话)的粒度比事务的概念更粗。然而,任何时候最多有一个未提交的事务与特定会话相关.

正如上面所强调的,我们正在讨论一些不应该发生的事情(即设计问题)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getCurrentSession 在网络中休眠 的相关文章

随机推荐