[英]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.