当前位置: 首页 > 面试题库 >

跨线程的Spring + Hibernate会话管理

董花蜂
2023-03-14
问题内容

我正在构建一个系统,其中来自客户端的每个请求都会在服务器端生成多个线程。然后,每个线程都使用一个或多个DAO(某些DAO可以同时被多个线程使用)。@AutowiredSpring
将所有DAO注入()到我的线程类中。每个DAO也接受SessionFactory注射。

什么是在这些多个DAO之间管理Hibernate会话的正确方法,这样我就不会因多线程环境而遇到问题(例如,来自不同线程的几个DAO试图同时使用同一会话)?

hibernate.current_session_context_class=thread在Hibernate配置中指定的内容就足够了,然后每次都在DAO中仅使用它SessionFactory.getCurrentSession()来完成工作?是否可以根据需要正确地检测和创建每个线程的会话?


问题答案:

是。够了

当设置hibernate.current_session_context_classthread,从返回的会话SessionFactory.getCurrentSession()是从ThreadLocal实例。

每个线程将拥有自己的独立ThreadLocal 实例,因此不同的线程将无法访问同一hibernate会话。

的行为SessionFactory.getCurrentSession()是:如果在当前线程中第一次调用它,则会打开并返回一个新的Session。如果在同一线程中再次调用它,将返回相同的会话。

结果,您只需调用即可获得同一会话,以在同一事务代码中的不同DAO方法中使用SessionFactory.getCurrentSession()。如果必须在同一事务代码中调用许多不同的DAO方法,则可以防止您通过DAO方法的输入参数传递Hibernate会话。



 类似资料:
  • 所以我有一个三层应用程序。通过spring boot starter jpa自动配置hibernate。以及使用@EnableJpaRepositories(enttityManagerFactory、transactionManager、basepackages)的配置类 我的问题是,如果控制器调用从数据库获取实体的服务,那么该服务是否可以将该实体传递给其他组件,而不会分离,考虑到它仍然是同一个

  • 问题内容: 我知道会话不是线程安全的。我的第一个问题:将实体传递给另一个线程,对它做一些工作,然后将其传递回原始线程并进行更新,是否安全? 我的第二个问题:在一个线程中创建一个实体并将其保存在另一个线程中是否安全? 编辑 我忘了提到实体是为快速加载而专门配置的 问题答案: 否。该实体已附加到会话中,并包含链接到该会话的代理(以延迟自身加载)。因此,这样做将使用多个线程中的会话。由于会话不是线程安全

  • 问题内容: 我有一个使用spring和hibernate的java stuts2 Web应用程序。 我越来越。 SpringBean.xml hibernate.cfg.xml CustomerServiceImpl.java CustomerDaoImpl.java CustomerAction.java 我得到的例外 问题答案: 您在Spring配置中指定了一个事务管理器,但是没有关于何时或何

  • 我们使用Hibernate(JPA)和Hibernate Envers来保存对象的历史。Web应用程序运行许多线程,其中一些是通过从其他应用程序调用RMI方法创建的,其中一些是由应用程序本身创建的,其中一些是为了处理超文本传输协议请求而创建的(它们生成视图)。 我们还使用视图中的开放会话模式来管理会话,因此我们的web。xml包含: 数据库是使用DAO访问的,它们都有由Spring注入的实体管理器

  • 问题内容: 我需要知道,hibernate的会话是否是线程安全的。但是很明显,新会话将附加到每个线程以执行。但是我的问题是,如果在一个线程中我已经更新了某个实体的某个值,那么这将在同一时间执行期间反映在另一个线程中吗? 我的问题是,当我依次从两个线程启动更新时,值会正确更新,但是当我几乎完全启动更新时,它将失败。 例如 表的当前阶段。 我正在尝试以下: 当我尝试在循环中运行上述代码(例如10)时,

  • 问题内容: 我收到以下错误 服务等级 DAO类 我在我的application-context.xml中有这个 谁能发现我为什么出现以下错误? 问题答案: 您使用@Transactional为Dao类添加了注释,但没有为服务类添加注释。该行: 要求您进行交易。 您可以通过将@Transactional批注添加到ProfileService类,或者只添加registerVisitor()方法来解决此