gpt4 book ai didi

java - Spring和Hibernate : Multiple connections,线程安全

转载 作者:行者123 更新时间:2023-12-02 11:08:38 25 4
gpt4 key购买 nike

我有一个现有的项目工作正常,但现在我必须实现一个备份系统,该系统在每天执行并将数据库转储到文件中。我想使用 ScheduledTask 来解决这个问题,但这意味着还有另一个使用 Hibernate 的 Thread

我的问题:我到底如何才能确保 Hibernate 线程安全?

我有以下代码(片段):

在applicationContext.xml中

<bean id="myEmf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dbDataSource" />
<property name="packagesToScan" value="redb.main.core.model" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</prop>
<!-- <prop key="hibernate.enable_lazy_load_no_trans">true</prop> -->
</props>
</property>
</bean>

<!-- Transaction Management -->
<tx:annotation-driven transaction-manager="txManager" />
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="myEmf" />
</bean>

<bean id="persistenceExceptionTranslationPostProcessor"
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

所以我可以通过

获取 EntityManager
@PersistenceContext
protected EntityManager entityManager;

但如果我理解正确的话,每个Thread都需要来自EntityManagerFactory的自己的EntityManager

如何在其他类中创建新的 EntityManager

我没有 persistence.xml。我必须创建它吗?

最佳答案

呵呵。欢迎来到 hell 。

主要的问题是,spring 尝试使用基于方面的解决方案来做到这一点。尽管这是有错误的(或不可调试的),但在微不足道的情况下它可以工作。

您的问题的一般答案是EntityManagerFactory可以是软件中的全局静态对象,尽管如果我只是使用它,我会感到震惊。

默认情况下,spring aop 在部署时“编织”您的应用程序,通过注释查找所有数据库实体类,并包装它们的方法以始终提供现有的实体管理器。这就是理论。但这不是惯例。

实际情况是,您几乎无法控制到底会发生什么。

我做了什么:有一个名为org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter的servlet过滤器,它可以为每个请求打开一个实体管理器,并根据需要刷新/关闭它。是的,它的名字与“views”有关,但很快它的名字就是它的第一个错误:实际上我们不得不将其称为“requesttransactionfilter”或类似的名称。它与 MVC View 没有任何关系,它正在处理来自 servlet 容器的 http 请求实体。

如果您不喜欢在 Spring 应用程序中使用 Servlet 过滤器,还有一个名为 OpenEntityManagerInViewInterceptor 的 Spring 拦截器,也具有非常相似的功能。

以编程方式,您可以通过 createEntityManager() 方法从 EntityManagerFactory 生成 EntityManager

谷歌搜索快乐!您正处于漫长道路的开始。

关于java - Spring和Hibernate : Multiple connections,线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26240424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com