成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JDBC分布式事務淺析

開發(fā) 后端 分布式
本文向您介紹JDB分布式事務,作者首先介紹J2EE平臺的數(shù)據(jù)源的整體構,由此逐層剖析JDBC的分布式事務。

在沒有開始JDBC分布式事務前,先來回顧一下J2EE平臺的數(shù)據(jù)源的整體構加:

在上面的介紹中,可能大家會過于限入理解如何實現(xiàn)ConnectionPoolDataSource和PooledConnection,而忘記了它的整體結構.為了幫助大家更快地理解,我從以下幾點進行總結.

聲明:本文完全是作者根據(jù)SUN的文檔從實踐中總結,沒有參考(事實上目前我還沒有找到這方面的參考)任何文章:

1.DataSource和ConnectionPoolDataSource的關系:

Sun的文檔中只對ConnectionPoolDataSource接口作了一般性規(guī)定,說明它是PooledConnection的工廠,即ConnectionPoolDataSource是傳統(tǒng)的連結池角色,它負責產生物理連結PooledConnection.而PooledConnection又是Connectio的工廠,一個PooledConnection對象負責產生多個Connection對象供應用程序調用.

而DataSource是對上面兩個過程的包裝,在DataSource中不僅要實現(xiàn)傳統(tǒng)連結池ConnectionPoolDataSource來產生物理連結PooledConnection,還要實現(xiàn)通過每個PooledConnection工廠來產生Connection,最后DataSource通過公開方法返回給調用者的是經(jīng)過兩次工廠出來的Connection.如果我們先不考慮JDBC分布式事務,只看下圖左邊,就是說工廠ConnectionPoolDataSource生成PooledConntion,二級工廠PooledConntion生產Connection,這兩個過程由DataSource在內部包裝,只提供最后的產品Connection.

2.DataSource是服務端數(shù)據(jù)源,而傳統(tǒng)的連結池是客戶端數(shù)據(jù)源:

傳統(tǒng)的連結池要調用者生成這個連池的實例,完成初如化,這樣一個數(shù)據(jù)庫為了防止連結池的實例生成無限多個物理連結,就要對保存物理連結的數(shù)據(jù)結構進行靜態(tài)定義,否則,你在你的程序中生成一個連結池對象,它生成30個物理連結,我又在我的程序中生成連結池實例,又生成30個物理連結,那就無法控制了,所以保存這30個物理連結的數(shù)據(jù)結構必須是靜態(tài)的.

而DataSource同一個對象初始化后,對象被綁定到jndi服務器上,通過jdni得到的是它的代碼存根,其中只包含Connection,而物理連結是不可能序列化的,所以不會被重新生成,調用者通過Connection對象作為參數(shù)傳給服務端,由它來操作實際的物理連結.

思考一下:如果不考慮性能問題,我是否可以把PooledConnction不再二次工廠化,只把PooledConntion作為Connection作為DataSource產品返回給調用者?

答案是不可以,因為物理連結不能序列化,也就是無法進行分布式引用.二次工廠化不僅解決了性能的問題,也同時解決了JDBC分布式事物調用的問題.

3.為什么說二次工廠化增加性能?

對于產生物理連結,沒有什么區(qū)別,但物理連結本身并沒有滿負載工作,也就是一個物理Connection(TMD,我現(xiàn)在也不好說Connection還是PooledConnectio,以前的Connection就是DataSource中的PooledConnection)其實可以同時綁定更多的Statement,而如果它直接給調用者調用了,句柄就被調用者拿去了,在調用者沒有返回時別的Statement沒法和它進行”聯(lián)系”.而二次工廠的目的就是把多人的Statement通過”新的引用Connection”和物理連結綁定,使它更好地工作.
舉個例子,汽車這種東西,在目前的中國還是很昂貴的,作為客戶(調用者)我有幾件貨物要運,但一輛汽車(物理連結)如果我一用,別人就不能用了.(傳統(tǒng)連結池和連結),盡管它還可以裝更多的貨物,現(xiàn)在汽車公司只能你一個車號(新的Connection),不給你實際的汽車,你只要把你的幾件東西只交給這個車號,而其他人也可能同時把幾件東西交給這個車號,最盡有更多的貨物因為使用同一車號而使那個物理汽車裝載了更多的貨物,當然如果它滿了的話會產生另一輛車,如果生產的輛達到規(guī)定的數(shù)目你只好等等了,但這樣把多個客戶的貨物和同一車號關聯(lián)使汽車能更多地處理事務,明顯地增加了性能.

理解了以上的結構,我們就不難理解javax.sql對分布式事務的支持,當然,如果你對事務本身還不理解,那我就沒辦法讓你理解以下的知識,因為我不可能再停下來講什么是事務.它是和JDBC相同級別的內容,也許在別的地方我會再講.

從上面的結構中右邊看到,在DataSource中,其實封裝了兩種工廠,這兩種工廠都是兩層次的,其實XADataSource的作用和ConnectioPooledDataSource一樣,都是產生物理連結的,只不過它產生支持分布式事務的物理連結XAConnectio而已,(以后記住,凡以XA命名的類都是支持JDBC分布式事務的標記.)我們看到,XAConnection中getConnection()出來的連結和PooledConnection中getConnection()出來的連結沒有區(qū)別,而Connection是DataSource的最終產品,這意味作什么?

這意味著支持分布式事務的過程由DataSource來做,你要操作的Connection和平時沒有兩樣,你只要聲明事務的開始和事務提交就行了!要使你的連結支持JDBC分布式事務,你要在DataSource的配置中指明type是XADataSource就行了.然后申請一個一務(為了說明方便省略了

  1. try{}catch(){})  
  2.    UserTransaction ut = ...........;  
  3.    ut.begin();  
  4.    Connection con1 = .........;  
  5.    Connection con2 = .........;  
  6.    Connection con3 = .........;  
  7.    if(條件) ut.setRollbackOnly();  
  8.    con1.close();  
  9.    con2.close();  
  10.    con3.close();  

考察一下,為什么XADataSource類型的物理工廠會產生的連結可以直接被事務管理呢?其實這就是封裝的好處了,在XADataSource產生XAConnection時,這個XAConnection實際是PooledConnection的子類,它擴展了一個getXAResource() 方法,事務通過這個方法把它加入到事務容器中進行管理.對于調用者來說,根本看不到事務是如果管理的,你只要聲明開始事務,告訴容器我下面的操作要求事務參與了,最后告訴事務說到這兒可以提交或回滾了,別的都是黑箱操作,不要你來做.

當然如果沒有分布式事務的需求,雖然XADataSource可以用于本地事務,但它要做很多資源測試,是一種浪費.

最后要說明的是,既然你把操作交給事務來做,你就要對他放心,事務邊界由容器管理,你只在最后確定是提交還是回滾還是強行回滾setRollbackOnly()(強行回滾后不可以再提交).你不要在事務中調用某一連結的rollback,commit,也不能把Connection設為自動提交,一般來說當你聲明為支持JDBC分布式事務的DataSource時,創(chuàng)建的連結默認都是關閉自動提交的,只是你自己不要打開它.

因為SUN的文檔只對DataSource接口作了一般規(guī)定,并沒有規(guī)定具體算法,所以我們在清楚上面的結構后,可以實現(xiàn)不依賴容器的DataSource(其實只是它的思想.因為你寫出來的不依賴容器的DataSource)已經(jīng)不是這個意義上的DataSource了.它不能綁定到服務器上讓遠程引用,所以生成物理連結的工廠應該是靜態(tài)的,而物理連結這種產品也應該是靜態(tài)的.然后再生成多個引用連結.但這好象沒有多大意義,因為純客戶端軟件一般來說不可能同時有上萬個客戶在線訪問的,根本用不著這么費事地實現(xiàn)連結池.

【編輯推薦】

  1. 簡述Spring JDBC的學習
  2. J2EE技術之JDBC連接數(shù)據(jù)庫的各種寫法
  3. JBoss JDBC驅動報錯問題分析與解決
  4. JavaBean中使用JDBC方式進行事務處理
  5. JDBC與JSP簡單模擬MVC三層架構
責任編輯:佚名 來源: CSDN
相關推薦

2020-03-31 08:05:23

分布式開發(fā)技術

2022-06-27 08:21:05

Seata分布式事務微服務

2022-06-21 08:27:22

Seata分布式事務

2017-07-26 15:08:05

大數(shù)據(jù)分布式事務

2019-10-10 09:16:34

Zookeeper架構分布式

2021-09-29 09:07:37

分布式架構系統(tǒng)

2009-09-18 15:10:13

分布式事務LINQ TO SQL

2013-12-06 09:37:49

分布式系統(tǒng)Travis CI

2019-06-26 09:41:44

分布式事務微服務

2025-04-29 04:00:00

分布式事務事務消息

2022-03-24 07:51:27

seata分布式事務Java

2025-05-15 08:05:00

2020-10-16 06:36:57

CapBase定理

2018-10-28 17:54:00

分布式事務數(shù)據(jù)

2023-12-26 08:59:52

分布式場景事務機制

2023-09-11 15:40:43

鍵值存儲云服務

2022-01-26 13:46:40

分布式事務集合,這

2010-07-26 13:25:11

SQL Server分

2021-02-01 09:35:53

關系型數(shù)據(jù)庫模型

2024-01-05 07:28:50

分布式事務框架
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品一区二区三区在线播放 | 一区二区三区亚洲 | 国产一区二区三区 | 亚洲激情在线观看 | 成人国产一区二区三区精品麻豆 | 久久国产精品99久久久大便 | 黄网址在线观看 | 91综合网 | 欧洲毛片 | 岛国av在线免费观看 | 中文字幕亚洲无线 | 国产精品视频免费播放 | 精品久久久久香蕉网 | 中文字幕视频在线观看 | 亚洲va国产日韩欧美精品色婷婷 | 国产成人一区 | 欧美黄色性生活视频 | 欧美video| 亚洲一区二区中文字幕 | 亚洲一区日韩 | 91色综合| 成人免费视频 | 成人av一区 | 免费一区二区三区 | 精品国产欧美 | 91成人免费 | 国产电影精品久久 | 国产成人久久精品一区二区三区 | 成人午夜在线 | 91精品无人区卡一卡二卡三 | 国产成人免费视频 | 91色在线视频 | 久久99网 | 超级乱淫av片免费播放 | 亚洲一二三视频 | 毛片毛片毛片毛片毛片 | 高清欧美性猛交 | 午夜小电影 | 国产亚洲精品久久久优势 | 精品美女视频在线观看免费软件 | 国际精品久久 |