我有一個現有的項目工作正常,但現在我必須實現一個備份系統執行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