一、概述
在日常專案中肯定需要用到資料源,那么資料源是什么,當遇到分布式事務的場景時資料源與非分布式事務場景的資料源又有什么不同呢,在J2EE中分布式事務又是如何實作的呢,希望本文可以解答您的疑惑,
二、 資料源
2.1 資料源是什么
通俗來講,資料源是存盤資料的地方,例如,資料庫是資料源,其他系統也可以是資料源,在J2EE里,資料源是代表物理資料存盤系統的實際Java物件,通過這些物件,J2EE應用可以獲取到資料庫的JDBC連接,
2.2 資料源的設計

從UML圖上可以看出,CommonDaraSource是對資料源概念的頂層抽象,約束了資料源必須實作的方法,資料源有三種型別的實作,分別是:
- DataSource,基本實作,用于生成標準Connection物件
- ConnectionPoolDataSource,連接池實作,這個資料源并不會直接創建資料庫物理連接,而是一個邏輯實作,它的作用在于池化資料庫物理連接,由于資料庫物理連接是一個重量級的物件,頻繁的創建銷毀很影響性能,將物理連接池化后可降低創建和銷毀的頻率,復用連接以充分利用連接資源,
- XAConnection,分布式事務實作,為支持分布式事務而誕生,這個資料源直接生產出的不是資料庫物理連接Connection,而是一個支持XA的XAConnection物件,XAConnection物件可以直接生產資料庫物理連接,同時生產XAResource用于支持XA事務,通常XAConnection物件生產出的資料庫物理連接Connection需要和該XAConnection生產出的XAResource物件配合使用以完成XA事務處理,并且XAConnection繼承PooledConnection,那就也具備連接池的實作,
三、為什么需要XA資料源
3.1 XA資料源是什么
XA資料源指的是支持XA規范的資料源,支持分布式事務,
3.2 XA規范是什么

XA規范是一種分布式事務解決方案,X/OPEN組織定義的分布式事務處理模型(DTP),其包含3種角色和兩個協議:
- AP(Application,應用程式)
- RM(Resources manager,資源管理器),通常指資料庫
- TM(Transaction manager,事務管理器),通常指事務協調者,負責協調和管理事務,提供給AP介面以及管理資源
- XA協議是事務管理器與資源管理器之間的通信介面
- TX協議是應用程式與事務管理器之間的通信介面
該模型中應用程式將一個全域事務傳送到事務管理器,事務管理器將每個全域事務分解為多個分支(分支事務),并將分支事務分配給單獨的資源管理器進行服務,事務管理器通過XA介面將每個分支事務與適當的資源管理器進行協調,
3.3 分布式事務具備有什么樣的作用?
如果僅在同一個事務背景關系中需要協調多種資源(即資料庫以及訊息主題或佇列等等),這個事務中的所有操作都必須成功,否則所有操作都將在失敗的情況下回滾,這就是XA資料源的作用,
3.4 那什么樣的場景需要使用XA?
- 您的JavaEE應用程式必須使用單個事務將資料存盤在兩個資料庫中
- 您的應用程式需要通過單個事務發送JMS訊息并將資訊存盤在資料庫中
- 您希望使用PVP將您自己專案的域資訊存盤在一個不同的資料庫中,而這個資料庫是被jBPM用來存盤它自己的資料,
四、 那怎么使用分布式事務呢?
4.1 J2EE的分布式事務
Java事務編程介面(Java Transaction API,JTA)和Java事務服務(Java Transaction Service,JTS)為J2EE平臺提供了分布式事務服務,
JTA事務是XA規范的Java實作,JTA事務有效的屏蔽了底層事務資源,使應用可以以透明的方式參與到事務處理中,分布式事務包括事務管理器和一個或多個支持XA協議的資源管理器,
JTA是面向應用或應用服務器與資源管理器的高層事務介面,
JTS是一組約定JTA中角色之間互動細節的規范,
JTA提供了以下四個介面
- javax.transaction.UserTransaction,是面向開發人員的介面,能夠編程地控制事務處理,UserTransaction.begin方法開啟一個全域事務,并且將該事務與呼叫執行緒關聯起來,
- javax.transaction.TransactionManager,允許應用程式服務器來控制代表正在管理的應用程式的事務,它本身并不承擔實際的事務處理功能,它更多的是充當UserTransaction介面和Transaction介面之間的橋梁,
- javax.transaction.Transaction,代表了一個物理意義上的事務,在開發人員呼叫UserTransaction.begin()方法時TransactionManager會創建一個Transaction事務物件,
- javax.transaction.xa.XAResource,面向提供商的實作介面,是一個基于X/Open CAE Specification的行業標準XA介面的Java映射,提供商在提供訪問自己資源的驅動時,必須實作這樣的介面,
開發者呼叫UserTransaction.begin方法時,因為UserTransaction的實作類持有TransactionManager,TransactionManager充當UserTransaction和Transaction之間的橋梁,所以在呼叫UserTransaction的begin方法時,TransactionManager會創建Transaction事務物件,并把此物件通過ThreadLocal關聯到當前執行緒,當呼叫UserTransaction其他方法時,會從當前執行緒取出事務物件Transaction物件,并通過Transaction物件找到與其關聯的XAResource物件,然后進行commit、rollback等操作,其基本流程如以下代碼:
// 創建一個Transaction,掛到當前執行緒上
UserTransaction userTx = null;
Connection connA = null;
Connection connB = null;
try{
userTx.begin();
// 將Connection對應的XAResource掛到當前執行緒對應的Transaction
connA.exec("xxx")
connB.exec("xxx")
// 找到Transaction關聯的XAResource,讓它們都提交
userTx.commit();
}catch(){
// 找到Transaction關聯的XAResource,讓它們都回滾
userTx.rollback();
}
4.2 如何使用J2EE的分布式事務
- WebLogic、Websphere、JBoss等主流的應用服務器提供了JTA的實作和支持,
- Tomcat中沒有提供JTA的實作的,這就需要借助第三方的框架Jotm、Automikos等來實作,
五、總結
本文主要介紹了資料源和XA資料源,以及分布式事務基本原理、作用和場景以及如何使用J2EE分布式事務,但這種是屬于基于資源層的底層分布式事務解決方案,在業內,用來解決分布式事務的方案還有柔性事務,柔性事務包括幾種型別:兩階段型、補償型、異步確保型和最大努力通知型,有興趣可以更深入的了解一下,
六、參考
- https://dzone.com/articles/datasources-what-why-how
- https://searchoracle.techtarget.com/news/918695/Data-sources-What-how-and-why
- https://docs.oracle.com/database/timesten-18.1/TTCDV/xa_dtp.htm#TTCDV328
- https://docs.oracle.com/javase/7/docs/api/javax/sql/CommonDataSource.html
- https://blog.csdn.net/conquer0715/article/details/50925674/
- https://www.ibm.com/developerworks/cn/java/j-lo-jta/
- https://www.dazhuanlan.com/2019/12/17/5df7d87d35561/
作者 | Karina Varela · Jun
翻譯 | 小青菜
來源 | https://dzone.com/articles/datasources-what-why-how
本文有spring4all技術翻譯組完成,更多國外前沿知識和干貨好文,歡迎關注公眾號:后端面試那些事兒,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/136600.html
標籤:Java
上一篇:學習CentOS6這一篇就夠了
