一、概述
在日常項目中肯定需要用到數據源,那麼數據源是什麼,當遇到分佈式事務的場景時數據源與非分佈式事務場景的數據源又有什麼不同呢,在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技術翻譯組完成,更多國外前沿知識和乾貨好文,歡迎關注公衆號:後端面試那些事兒。