当前位置: 首页 > 知识库问答 >
问题:

Hibernate JTA 多用户会话-事务映射

宗增
2023-03-14

我指的是https://developer.jboss.org/wiki/SessionsAndTransactions,目前正试图了解与JTA的划界问题。它声明在使用getCurrentSession()的特定事务中,总是给出相同的当前会话。是不是意味着:

    < li >如果另一个用户在另一个线程中执行同一段代码(通过查找获取一个事务,然后使用getCurrentSession()并关闭该事务),该用户将拥有自己的事务和自己的当前会话,即两个用户的当前会话对他们自己来说是相同的,但彼此不同。 < li >如果1为真,并且基于JTA分界链接中显示的代码,当使用getCurrentSession()时,系统(读取Hibernate)如何理解哪个会话响应哪个用户?毕竟,我们不会将事务作为参数传递给getCurrentSession()。

非常感谢任何指针/帮助。

谢谢

共有1个答案

彭华皓
2023-03-14

根据爪哇多克会话工厂.getCurrentSsion()

“当前”确切含义的定义由配置为使用的{@link-org.hibernate.context.spi.CurrentSessionContext}impl控制

JTA被配置为默认为{ @ link org . hibernate . context . internal . jtasessioncontext } impl。

然后你可以看到JTASessionContext javadoc和实现。

如果在调用{@link #currentSession()}时,某个会话尚未与当前的JTA事务关联,则将打开一个新会话,该会话将与该JTA事务关联。

public Session currentSession() throws HibernateException {
  ...
  final TransactionManager transactionManager = jtaPlatform.retrieveTransactionManager();
  ...
  txn = transactionManager.getTransaction();
  ...
  final Object txnIdentifier = jtaPlatform.getTransactionIdentifier( txn );
  ...
  Session currentSession = currentSessionMap.get( txnIdentifier );
  ...
}

TransactionManager javadoc

在内部,事务管理器将事务与线程相关联,这里的方法对与调用线程关联的事务进行操作。

因此,它类似于(但更清楚地)使用普通JDBC的会话和事务/事务划分:

换句话说,会话在幕后绑定到线程,但作用域是事务,就像在JTA环境中一样。

 类似资料:
  • 我对Hibernate中的会话和事务的概念有点困惑。据我所知,Hibernate使用会话(持久性上下文),它基本上是需要持久,删除或数据库中任何内容的实体的缓存。会话封装事务,因此我启动一个会话,然后创建一个事务。事务关闭后,持久性上下文中的所有内容都将刷新到数据库,如果我关闭会话,也会发生同样的事情。 为什么我需要两者?我可以在不创建交易的情况下做同样的事情吗?

  • 是否可以使用Hibernate Spring对以下内容进行建模。 公开会议 我使用Spring TransactionTemplate,它同时执行会话事务生存期范围。 原因是,有时我在业务流程中有几个阶段,我希望在每个阶段完成后提交。但是,我希望继续使用相同的持久对象。如果每个事务都有一个单独的会话,则会出现暂时/分离的异常,因为原始会话已关闭。 这有可能吗?

  • 我有一个问题,如果我的服务上有一个客户端调用两个方法,它就会失败,因为第二个方法中的事务没有与之关联的会话。但是,如果我将这两种方法组合到服务中,并从客户机代码中调用其中一种方法,它就会成功。 谁能给我解释一下为什么会这样? 考虑下面的代码: 所以这里发生的事情是,在我的客户机代码中(它不知道事务),如果我调用#getChildrenFor(id),我就没事了。但如果我打电话: 然后hiberna

  • 监听器类提供给开发人员一种跟踪 Web 应用内会话的方式。它通常是有用的,在跟踪会话知道一个会话是否变为失效,因为容器超时会话,或因为应用内的一个 Web 组件调用了 invalidate 方法。该区别可能会间接地决定使用监听器和 HttpSession API方法。

  • 如果一个服务方法被标记为具有传播嵌套的,并且在它内部有许多对其他方法的调用,那么这些方法中的每一个都将使用自己的会话?它应该表示多个连接到db,只有一个方法调用no?

  • 我有一个cordova应用程序,我有一个登录页面和一个登录用户的内页。每当用户会话消失时,它就会请求登录信息。如何防止ths cordova应用程序在重启移动应用程序时删除会话uppon重启或恢复cookie和会话信息?所以登录屏幕不会每次都出现?