數據源面試三連殺:是啥?爲何要用?怎麼用?

1、概述

在平常項目中確定須要用到數據源,那麼數據源是什麼,當遇到分佈式事務的場景時數據源與非分佈式事務場景的數據源又有什麼不一樣呢,在J2EE中分佈式事務又是如何實現的呢,但願本文能夠解答您的疑惑。html

2、 數據源

2.1 數據源是什麼

通俗來說,數據源是存儲數據的地方。例如,數據庫是數據源,其餘系統也能夠是數據源。在J2EE裏,數據源是表明物理數據存儲系統的實際Java對象。經過這些對象,J2EE應用能夠獲取到數據庫的JDBC鏈接。java

2.2 數據源的設計

從UML圖上能夠看出,CommonDaraSource是對數據源概念的頂層抽象,約束了數據源必須實現的方法。數據源有三種類型的實現,分別是:面試

  • DataSource,基本實現,用於生成標準Connection對象
  • ConnectionPoolDataSource,鏈接池實現,這個數據源並不會直接建立數據庫物理鏈接,而是一個邏輯實現,它的做用在於池化數據庫物理鏈接。因爲數據庫物理鏈接是一個重量級的對象,頻繁的建立銷燬很影響性能,將物理鏈接池化後可下降建立和銷燬的頻率,複用鏈接以充分利用鏈接資源。
  • XAConnection,分佈式事務實現,爲支持分佈式事務而誕生,這個數據源直接生產出的不是數據庫物理鏈接Connection,而是一個支持XA的XAConnection對象,XAConnection對象能夠直接生產數據庫物理鏈接,同時生產XAResource用於支持XA事務,一般XAConnection對象生產出的數據庫物理鏈接Connection須要和該XAConnection生產出的XAResource對象配合使用以完成XA事務處理。而且XAConnection繼承PooledConnection,那就也具有鏈接池的實現。

3、爲何須要XA數據源

3.1 XA數據源是什麼

XA數據源指的是支持XA規範的數據源,支持分佈式事務。spring

3.2 XA規範是什麼

img

XA規範是一種分佈式事務解決方案。X/OPEN組織定義的分佈式事務處理模型(DTP),其包含3種角色和兩個協議:sql

  • AP(Application,應用程序)
  • RM(Resources manager,資源管理器),一般指數據庫
  • TM(Transaction manager,事務管理器),一般指事務協調者,負責協調和管理事務,提供給AP接口以及管理資源
  • XA協議是事務管理器與資源管理器之間的通訊接口
  • TX協議是應用程序與事務管理器之間的通訊接口

該模型中應用程序將一個全局事務傳送到事務管理器,事務管理器將每一個全局事務分解爲多個分支(分支事務),並將分支事務分配給單獨的資源管理器進行服務,事務管理器經過XA接口將每一個分支事務與適當的資源管理器進行協調。數據庫

3.3 分佈式事務具有有什麼樣的做用?

若是僅在同一個事務上下文中須要協調多種資源(即數據庫以及消息主題或隊列等等),這個事務中的全部操做都必須成功,不然全部操做都將在失敗的狀況下回滾。這就是XA數據源的做用。編程

3.4 那什麼樣的場景須要使用XA?

  • 您的JavaEE應用程序必須使用單個事務將數據存儲在兩個數據庫中
  • 您的應用程序須要經過單個事務發送JMS消息並將信息存儲在數據庫中
  • 您但願使用PVP將您本身項目的域信息存儲在一個不一樣的數據庫中,而這個數據庫是被jBPM用來存儲它本身的數據。

4、 那怎麼使用分佈式事務呢?

4.1 J2EE的分佈式事務

Java事務編程接口(Java Transaction API,JTA)和Java事務服務(Java Transaction Service,JTS)爲J2EE平臺提供了分佈式事務服務。後端

JTA事務是XA規範的Java實現,JTA事務有效的屏蔽了底層事務資源,使應用能夠以透明的方式參與到事務處理中。分佈式事務包括事務管理器和一個或多個支持XA協議的資源管理器。api

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等來實現。

5、總結

本文主要介紹了數據源和XA數據源,以及分佈式事務基本原理、做用和場景以及如何使用J2EE分佈式事務,但這種是屬於基於資源層的底層分佈式事務解決方案,在業內,用來解決分佈式事務的方案還有柔性事務,柔性事務包括幾種類型:兩階段型、補償型、異步確保型和最大努力通知型,有興趣能夠更深刻的瞭解一下。

6、參考

做者 | Karina Varela · Jun
翻譯 | 小青菜
來源 | https://dzone.com/articles/da... 本文有spring4all技術翻譯組完成,更多國外前沿知識和乾貨好文,歡迎關注公衆號:後端面試那些事兒。
相關文章
相關標籤/搜索