使用事務同步資源
現在應該清楚如何建立不同的事務管理器以及它們如何與需要同步到事務的相關資源(例如,DataSourceTransactionManager 到 JDBC DataSource,HibernateTransactionManager 到 Hibernate SessionFactory 等)連結。本節描述了應用程式程式碼(直接或間接,透過使用 JDBC、Hibernate 或 JPA 等持久化 API)如何確保這些資源被正確建立、重用和清理。本節還討論瞭如何透過相關的 TransactionManager(可選地)觸發事務同步。
高階同步方法
首選方法是使用 Spring 最高級別的基於模板的持久化整合 API,或者使用帶有事務感知工廠 bean 或代理的本地 ORM API 來管理本地資源工廠。這些事務感知解決方案內部處理資源的建立和重用、清理、資源的可選事務同步以及異常對映。因此,使用者資料訪問程式碼不必處理這些任務,而可以純粹專注於非樣板化的持久化邏輯。通常,您可以使用本地 ORM API 或透過使用 JdbcTemplate 採用模板方法進行 JDBC 訪問。這些解決方案將在本參考文件的後續章節中詳細介紹。
低階同步方法
像 DataSourceUtils(用於 JDBC)、EntityManagerFactoryUtils(用於 JPA)、SessionFactoryUtils(用於 Hibernate)等類存在於較低級別。當您希望應用程式程式碼直接處理本地持久化 API 的資源型別時,您可以使用這些類來確保獲取正確的 Spring Framework 管理例項,(可選地)同步事務,並將過程中發生的異常正確對映到一致的 API。
例如,對於 JDBC,您可以不使用傳統的 JDBC 方法呼叫 DataSource 上的 getConnection() 方法,而是使用 Spring 的 org.springframework.jdbc.datasource.DataSourceUtils 類,如下所示
Connection conn = DataSourceUtils.getConnection(dataSource);
如果現有事務已同步(連結)到連線,則返回該例項。否則,方法呼叫會觸發新連線的建立,該連線(可選地)同步到任何現有事務,並可供該同一事務中的後續重用。如前所述,任何 SQLException 都將包裝在 Spring Framework 的 CannotGetJdbcConnectionException 中,這是 Spring Framework 的未經檢查的 DataAccessException 型別層次結構之一。這種方法比從 SQLException 輕鬆獲取的資訊更多,並確保了跨資料庫甚至跨不同持久化技術的移植性。
此方法也適用於沒有 Spring 事務管理的情況(事務同步是可選的),因此無論您是否使用 Spring 進行事務管理,都可以使用它。
當然,一旦您使用了 Spring 的 JDBC 支援、JPA 支援或 Hibernate 支援,您通常會更喜歡不使用 DataSourceUtils 或其他輔助類,因為您更喜歡透過 Spring 抽象而不是直接使用相關 API 進行工作。例如,如果您使用 Spring JdbcTemplate 或 jdbc.object 包來簡化 JDBC 的使用,正確的連線檢索會在幕後進行,您無需編寫任何特殊程式碼。
TransactionAwareDataSourceProxy
在最低級別存在 TransactionAwareDataSourceProxy 類。這是一個目標 DataSource 的代理,它包裝目標 DataSource 以新增對 Spring 管理事務的感知。在這方面,它類似於 Jakarta EE 伺服器提供的事務性 JNDI DataSource。
您幾乎永遠不需要或不想使用此 A類,除非必須呼叫現有程式碼並傳遞標準的 JDBC DataSource 介面實現。在這種情況下,此程式碼可能可用,但正在參與 Spring 管理的事務。您可以透過使用前面提到的更高級別的抽象來編寫新程式碼。