1. 程式人生 > 實用技巧 >資料來源面試三連殺:是啥?為什麼要用?怎麼用?

資料來源面試三連殺:是啥?為什麼要用?怎麼用?

一、概述

在日常專案中肯定需要用到資料來源,那麼資料來源是什麼,當遇到分散式事務的場景時資料來源與非分散式事務場景的資料來源又有什麼不同呢,在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分散式事務,但這種是屬於基於資源層的底層分散式事務解決方案,在業內,用來解決分散式事務的方案還有柔性事務,柔性事務包括幾種型別:兩階段型、補償型、非同步確保型和最大努力通知型,有興趣可以更深入的瞭解一下。

六、參考

作者 | Karina Varela · Jun
翻譯 | 小青菜
來源 | https://dzone.com/articles/datasources-what-why-how
本文有spring4all技術翻譯組完成,更多國外前沿知識和乾貨好文,歡迎關注公眾號:後端面試那些事兒。