?
This document uses PHP Chinese website manual Release
現(xiàn)在應(yīng)該比較清楚的是:不同的事務(wù)管理器是如何創(chuàng)建的,以及它們?nèi)绾伪贿B接到相應(yīng)的需要被同步到事務(wù)的資源上(例如,DataSourceTransactionManager
對(duì)應(yīng)到JDBC DataSource
,
HibernateTransactionManager
對(duì)應(yīng)到Hibernate的 SessionFactory
等)??墒?,剩下的問(wèn)題是,直接或間接地使用一種持久化API(JDBC、Hibernate、JDO等)的應(yīng)用代碼,如何確保通過(guò)相關(guān)的 PlatformTransactionManager
來(lái)恰當(dāng)?shù)孬@取并操作資源,來(lái)滿足事務(wù)同步,這些操作包括:創(chuàng)建、復(fù)用、清理 和 觸發(fā)(可能沒(méi)有)。
首選的方法是使用Spring的高層持久化集成API。這種方式不會(huì)替換原始的API,而是在內(nèi)部封裝了資源創(chuàng)建、復(fù)用、清理、事務(wù)同步以及異常映射等功能,這樣用戶的數(shù)據(jù)訪問(wèn)代碼就不必關(guān)心這些,而集中精力于自己的持久化邏輯。通常,對(duì)所有持久化API都采用這種 模板 方法,包括 JdbcTemplate
、HibernateTemplate
和JdoTemplate
類(這些在這份參考文檔后面的章節(jié)中詳細(xì)敘述)。
在較低層次上,有以下這些類:DataSourceUtils
(針對(duì)JDBC),SessionFactoryUtils
(針對(duì)Hibernate),PersistenceManagerFactoryUtils
(針對(duì)JDO)等等。當(dāng)對(duì)應(yīng)用代碼來(lái)說(shuō),直接同原始持久化API特有的資源類型打交道是更好的選擇時(shí),這些類確保應(yīng)用代碼獲取到正確的Spring框架所管理的bean,事務(wù)被正確同步,處理過(guò)程中的異常被映射到一致的API。
例如,在JDBC環(huán)境下,你不再使用傳統(tǒng)的調(diào)用 DataSource
的 getConnection()
方法的方式,而是使用Spring的 org.springframework.jdbc.datasource.DataSourceUtils
,像這樣:
Connection conn = DataSourceUtils.getConnection(dataSource);
如果已有一個(gè)事務(wù)及與之關(guān)聯(lián)的connection存在,該實(shí)例將被返回。否則,該方法調(diào)用將觸發(fā)起一個(gè)新的connection的創(chuàng)建動(dòng)作,該connection(可選地)被同步到任何現(xiàn)有的事務(wù),并可以在同一事務(wù)范圍內(nèi)被后續(xù)的調(diào)用復(fù)用。正如上面提到的,這個(gè)過(guò)程有一個(gè)額外的好處,就是任何 SQLException
將被包裝為Spring框架的 CannotGetJdbcConnectionException
,該類是Spring框架的unchecked的DataAccessExceptions層次體系中的一員。這將給你比從 SQLException
中簡(jiǎn)單所得更多的信息,而且保證了跨數(shù)據(jù)庫(kù)――甚至其他持久化技術(shù)――的移植性。
應(yīng)該指出的是,這些類同樣可以在沒(méi)有Spring事務(wù)管理的環(huán)境中工作良好(事務(wù)同步能力是可選的),所以無(wú)論你是否使用Spring的事務(wù)管理,你都可以使用這些類。
當(dāng)然,一旦你用過(guò)Spring的JDBC支持或Hibernate支持,你一般就不再會(huì)選擇 DataSourceUtils
或是別的輔助類了,因?yàn)槟銜?huì)更樂(lè)意與Spring抽象一起工作,而不是直接使用相關(guān)的API。例如,如果你使用Spring的 JdbcTemplate
或 jdbc.object
包來(lái)簡(jiǎn)化使用JDBC,Spring會(huì)在幕后替你正確地獲取連接,而你不需要寫(xiě)任何特殊代碼。
工作在最底層的是 TransactionAwareDataSourceProxy
類。這是一個(gè)對(duì)目標(biāo) DataSource
的代理,它包裝了目標(biāo) DataSource
,提供對(duì)Spring管理事務(wù)的可知性。在這點(diǎn)上,它類似于一個(gè)J2EE服務(wù)器提供的事務(wù)性JNDI DataSource
。
該類應(yīng)該永遠(yuǎn)不需要被應(yīng)用代碼使用,除非現(xiàn)有代碼存在需要直接傳遞一個(gè)標(biāo)準(zhǔn)的JDBC的 DataSource
的情況。這時(shí)可以通過(guò)參與Spring管理事務(wù)讓這些代碼仍然有用。書(shū)寫(xiě)新的代碼時(shí),首選的方法是采用上面提到的Spring高層抽象。