我有一个现有的项目工作正常,但现在我必须实现一个备份系统执行exery日,并将数据库转储到文件。我想用ScheduledTask
解决这个问题,但这意味着有另一个Thread
使用Hibernate。春天和休眠:多个连接,线程安全
我的问题:究竟如何让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
需要自己的EntityManager
从EntityManagerFactory
。
如何在其他课程中创建新的EntityManager
?我有persistence.xml
。我必须创建它吗?
Spring将注入一个线程绑定'EntityManger'(如文档中所述)。只要确保你所做的是在一个事务中,这样就会有一个线程绑定'EntityManager'。你没有得到一个单独的线程,每个线程都有它自己的(如果你使用'OpenEntityManagerInViewFilter/-Interceptor',那么在事务或者请求期间,但在这里不适用,因为你需要我们后台线程)。但是,让数据库执行备份而不是尝试外部化它不是更容易吗? – 2014-10-07 18:20:20
如果事务没有开始(假设你有'@ Transactional'),确保你有一个' '来启用事务。还要确保你没有复制bean实例,在你的'ContextLoaderListener'和'DispatcherServlet'中有'component-scan'可能会导致(取决于设置)重复bean,其中一个被代理并且有事务,另一个不。在过滤器中不应该有一个事务(还),因为它在其他事务之前执行,过滤器不会启动事务,而是将一个EntityManager绑定到当前线程。 –
2014-10-08 07:55:56