簡體   English   中英

多個分片數據庫休眠事務

[英]Multiple Sharded Databases Hibernate Transactions

我有一個基於spring的tomcat服務。 我使用基於注釋的休眠映射,並且有多個分片數據庫。 學生說,所有分片數據庫都有相同的表。 我想使用@Transactional注釋在其上實現事務。

@Autowired
List<SessionFactory> sessionFactoryList;

@Transactional
public insertStudentBatch(List<Student> students) {

}

現在,我要插入整個批次。 如果發生任何錯誤,我希望它們全部回滾。 最好的方法是什么? 我可以編寫多個@Transactional("txManager1", "txManager2") TransactionManager @Transactional("txManager1", "txManager2")類的TransactionManager限定符嗎?

不,不幸的是spring @Transactional批注特定於單個事務管理器,並不符合您所描述的願望。

在我看來,您可能想要的是用於2PC提交的JTA事務,在該事務中,您基本上啟動了主JTA事務,然后對於每個SessionFactory ,為分片調用每個特定的事務管理器並執行操作。

 @Service
 public class StudentBatchServiceImpl implements StudentBatchService {
   @Autowired List<StudentService> studentServices;
   @Transactional(value = "jtaTransactionManager")
   public void storeStudents(List<Student> students) {
     for(StudentService service : studentServices) 
       service.storeStudents(students);
   }
 }

 public interface StudentService {
   void storeStudents(List<Student> students);
 }

 public abstract AbstractStudentServiceImpl implements StudentService {
   protected void storeStudents(EntityManager em, List<Student> students) {
     for(Student student : students) {
       em.persist(student);
     }
   }
 }

 @Service
 public class Shard1StudentServiceImpl extends AbstractStudentServiceImpl {
   @PersistenceContext(name = "shard1")
   private EntityManager entityManager;
   @Override
   @Transactional(value = "shard1TransactionManager")
   public void storeStudents(List<Student> students) {
     storeStudents(entityManager, students);
   }
 }

在沒有使用JTA進行2PC提交設置的情況下,可能還有其他方法可以解決此問題,但是通常在容器管理的事務中(例如JBoss,WebLogic等); 這就是方法。

作為側邊欄,如果您已經在彈簧路徑上了,我建議您檢查一下spring-batch 它為大量用例的批處理操作提供了不錯的基准。 我上面描述的是spring-batch中一個案例的窮人化實現。

更新

如果要避免創建帶有批注詳細信息的多個分片類實現,則可以求助於XML配置並使用單個類實現:

 <bean id="shard1" class="default.ShardStudentServiceImpl">
   <property name="entityManager" ref="shard1EntityManager" />
   <property name="transactionManager" ref="shard1TransactionManager" />
 </bean>

唯一的區別是,您必須用XML定義25個分片,然后必須編寫自己的代碼來啟動,提交和管理ShardStudentServiceImpl類中的事務。

在上面顯示的最終實現中,將抽象基類與注釋結合使用,我的更新到達了相同的目的地。 實際上,如果您查看spring-batch ,您會注意到它們的批處理配置遵循類似的前提,即將實體管理器和事務管理器指定為單個類的輸入屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM