?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
DataSourceUtils
作為一個幫助類提供易用且強大的數(shù)據(jù)庫訪問能力,
我們可以使用該類提供的靜態(tài)
方法從JNDI獲取數(shù)據(jù)庫連接以及在必要的時候關閉之。
它提供支持線程綁定的數(shù)據(jù)庫連接(比如使用DataSourceTransactionManager
的時候,將把數(shù)據(jù)庫連接綁定到當前的線程上)。
SmartDataSource
是DataSource
接口的一個擴展,用來提供數(shù)據(jù)庫連接。使用該接口的類在指定的操作之后可以檢查是否需要關閉連接。該接口在某些情況下非常有用,比如有些情況需要重用數(shù)據(jù)庫連接。
AbstractDataSource
是一個實現(xiàn)了DataSource
接口的abstract
基類。它實現(xiàn)了DataSource
接口的
一些無關痛癢的方法,如果你需要實現(xiàn)自己的DataSource
,那么可以繼承該類。
SingleConnectionDataSource
是SmartDataSource
接口
的一個實現(xiàn),其內部包裝了一個單連接。該連接在使用之后將不會關閉,很顯然它不能在多線程的環(huán)境下使用。
當客戶端代碼調用close方法的時候,如果它總是假設數(shù)據(jù)庫連接來自連接池(就像使用持久化工具時一樣),
你應該將suppressClose
設置為true。這樣,通過該類獲取的將是代理連接(禁止關閉)而不是原有的物理連接。
需要注意的是,我們不能把使用該類獲取的數(shù)據(jù)庫連接造型(cast)為Oracle Connection之類的本地數(shù)據(jù)庫連接。
SingleConnectionDataSource
主要在測試的時候使用。它使得測試代碼很容易脫離應用服務器而在一個簡單的JNDI環(huán)境下運行。
與DriverManagerDataSource
不同的是,它始終只會使用同一個數(shù)據(jù)庫連接,從而避免每次建立物理連接的開銷。
DriverManagerDataSource
類實現(xiàn)了
SmartDataSource
接口??梢允褂胋ean properties來設置JDBC Driver屬性,該類每次返回的都是一個新的連接。
該類主要在測試以及脫離J2EE容器的獨立環(huán)境中使用。它既可以用來在application context中作為一個DataSource
bean,也可以在簡單的JNDI環(huán)境下使用。
由于Connection.close()
僅僅只是簡單的關閉數(shù)據(jù)庫連接,因此任何能夠獲取DataSource
的持久化代碼都能很好的工作。不過使用JavaBean風格的連接池
(比如commons-dbcp)也并非難事。即使是在測試環(huán)境下,使用連接池也是一種比使用DriverManagerDataSource
更好的做法。
TransactionAwareDataSourceProxy
作為目標DataSource
的一個代理,
在對目標DataSource
包裝的同時,還增加了Spring的事務管理能力,
在這一點上,這個類的功能非常像J2EE服務器所提供的事務化的JNDI DataSource
。
該類幾乎很少被用到,除非現(xiàn)有代碼在被調用的時候需要一個標準的 JDBC DataSource
接口實現(xiàn)作為參數(shù)。
這種情況下,這個類可以使現(xiàn)有代碼參與Spring的事務管理。通常最好的做法是使用更高層的抽象
來對數(shù)據(jù)源進行管理,比如JdbcTemplate
和DataSourceUtils
等等。
如果需要更詳細的資料,請參考 TransactionAwareDataSourceProxy
JavaDocs。
DataSourceTransactionManager
類是
PlatformTransactionManager
接口的一個實現(xiàn),用于處理單JDBC數(shù)據(jù)源。
它將從指定DataSource取得的JDBC連接綁定到當前線程,因此它也支持了每個數(shù)據(jù)源對應到一個線程。
我們推薦在應用代碼中使用DataSourceUtils.getConnection(DataSource)
來獲取
JDBC連接,而不是使用J2EE標準的DataSource.getConnection
。因為前者將拋出
unchecked的org.springframework.dao
異常,而不是checked的
SQLException
異常。Spring Framework中所有的類(比如
JdbcTemplate
)都采用這種做法。如果不需要和這個
DataSourceTransactionManager
類一起使用,DataSourceUtils
提供的功能跟一般的數(shù)據(jù)庫連接策略沒有什么兩樣,因此它可以在任何場景下使用。
DataSourceTransactionManager
類支持定制隔離級別,以及對SQL語句查詢超時的設定。
為了支持后者,應用代碼必須使用JdbcTemplate
或者在每次創(chuàng)建SQL語句時調用DataSourceUtils.applyTransactionTimeout(..)
方法。
在使用單個數(shù)據(jù)源的情形下,你可以用DataSourceTransactionManager
來替代JtaTransactionManager
,
因為DataSourceTransactionManager
不需要容器支持JTA。如果你使用DataSourceUtils.getConnection(DataSource)
來獲取
JDBC連接,二者之間的切換只需要更改一些配置。最后需要注意的一點就是JtaTransactionManager
不支持隔離級別的定制!
有時我們需要執(zhí)行特殊的,由特定廠商提供的與標準JDBC的API不同的JDBC方法。此時,當我們在某個應用服務器上運行包裝了這些廠商各自實現(xiàn)的Connection
, Statement
和ResultSet
對象的DataSource
時,可能會遇到一些問題。如果你要訪問這些對象,你可以配置一個包含NativeJdbcExtractor
的JdbcTemplate
或者OracleLobHandler
。
NativeJdbcExtractor根據(jù)執(zhí)行環(huán)境的不同,會有不同的風格的實現(xiàn):
SimpleNativeJdbcExtractor
C3P0NativeJdbcExtractor
CommonsDbcpNativeJdbcExtractor
JBossNativeJdbcExtractor
WebLogicNativeJdbcExtractor
WebSphereNativeJdbcExtractor
XAPoolNativeJdbcExtractor
通常來說SimpleNativeJdbcExtractor
類對于絕大多數(shù)環(huán)境,已經(jīng)足以屏蔽 Connection
對象。可以參見Java Docs獲取詳細信息。