JDBC方式連接數(shù)據(jù)庫的弊端
- 使用JDBC方式每次調(diào)用
DriverManger.getConnection()
, 獲取數(shù)據(jù)庫連接都會創(chuàng)建一個新的數(shù)據(jù)庫連接(資源消耗太大
)蕾总; - 詳細(xì)JDBC概念仍翰,請點(diǎn)擊查看我的另外一篇文章
連接池
- 為了解決JDBC頻繁連接數(shù)據(jù)庫所造成的系統(tǒng)資源消耗胁镐,可以
事先創(chuàng)建
一些連接備用; - 當(dāng)需要時蘸吓,從這些連接中選擇一個提供出去车海;
- 當(dāng)連接使用完畢后枢舶,
并不是真正的關(guān)閉
,而是將這些數(shù)據(jù)狀態(tài)還原棠笑,然后繼續(xù)等待下一個人使用;
DataSource
- 數(shù)據(jù)源
DataSource
作為中間層
將DriverManager
生成的連接梦碗,組織
到連接池中,然后從池中提供連接
蓖救。 - DataSource中獲取的連接來自于
連接池中
洪规,而池中的連接根本
也還是從DriverManager
獲取而來; - 對外呈現(xiàn)
DataSource
就是類似于DriverManager
的一個存在循捺。
image.png
DataSource的形式是JNDI (Java Naming Directory Interface)
- DataSource是JNDI資源的一種;
- 可以簡單的認(rèn)為JNDI是一個
哈希表
斩例,類型為<String,Object>
- JNDI的兩個最主要操作:
bind
和lookup
从橘。bind操作負(fù)責(zé)往哈希表里存對象念赶,lookup則根據(jù)這個鍵值字符串往外取對象。 - 開發(fā)人員可以使用鍵值——也就是一個字符串名稱——來獲取某個對象恰力。
- 簡言之就是可以給一個對象命名叉谜,然后可以通過名稱找到這個對象。
- 目前JBoss和各個數(shù)據(jù)庫連接池提供了JNDI的支持踩萎。只不過數(shù)據(jù)庫連接池廠商除了提供JNDI的方式外停局,還提供了各自更加簡便的方式而已,我們目前使用的大部分是數(shù)據(jù)庫連接池廠商各自簡便的方式香府。
數(shù)據(jù)源DataSrouce的具體實現(xiàn)
- 關(guān)于數(shù)據(jù)源有以下幾個核心的接口
-
CommonDataSource
接口定義了DataSource董栽、XADataSource
和ConnectionPoolDataSource
之間公用的方法。 -
DataSource
是官方定義的獲取connection
的接口; -
ConnectionPoolDataSource
是官方定義的從connection pool連接池
中拿connection
的接口; -
XADataSource
是定義的用來獲取分布式事務(wù)連接的接口 - 也就是分為了三個方向企孩,
基本實現(xiàn)锭碳,連接池,事務(wù)
;
image.png
image.png
DataSource 接口由驅(qū)動程序供應(yīng)商實現(xiàn)勿璃。共有三種類型的實現(xiàn):
- 基本實現(xiàn) : 生成標(biāo)準(zhǔn)的 Connection 對象
- 連接池實現(xiàn): 生成自動參與連接池的 Connection 對象擒抛。此實現(xiàn)與中間層連接池管理器一起使用推汽。
-
分布式事務(wù)實現(xiàn): 生成一個 Connection 對象,該對象可用于分布式事務(wù)歧沪,大多數(shù)情況下總是參與連接池民泵。此實現(xiàn)與中間層事務(wù)管理器一起使用,大多數(shù)情況下總是與連接池管理器一起使用, 分布式事務(wù)Transation對象
資源
類圖如下:(可以請清晰的看到槽畔,分布式事務(wù)XADataSrouce獲取XAConnection也是從數(shù)據(jù)庫連接池中獲取的)
image.png
總結(jié):
- 因為JDBC每次獲取連接都需要創(chuàng)建數(shù)據(jù)庫連接,所以使用DataSource代替JDBC胁编,應(yīng)用程序使用DataSource接口方式操作數(shù)據(jù)庫厢钧。
-
DataSource
用JDBC的DriverManger
方式穿件數(shù)據(jù)庫連接,并講數(shù)據(jù)庫連接放入連接池中嬉橙,用戶獲取數(shù)據(jù)庫連接的時候只需要DataSource.getConnection()
從數(shù)據(jù)庫連接池中獲取即可早直。 -
DataSource
初始化的時候就默認(rèn)創(chuàng)建多個數(shù)據(jù)庫連接,放入連接池中市框。 - 總之一句話:DataSource作為JDBC DriverManger的替代品霞扬,它的底層實現(xiàn)依然是DriverManger, 只不過DataSource除了基本的數(shù)據(jù)庫連接外,擁有更多的功能:
連接池枫振,分布式事務(wù)
等喻圃。