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