資源與交易同步

如何建立不同的交易管理器,以及它們如何連結到需要與交易同步的相關資源(例如,DataSourceTransactionManager 對應到 JDBC DataSourceHibernateTransactionManager 對應到 Hibernate SessionFactory 等等),現在應該很清楚了。本節描述應用程式碼(直接或間接地,透過使用持久性 API,例如 JDBC、Hibernate 或 JPA)如何確保正確地建立、重複使用和清理這些資源。本節也討論如何(可選地)透過相關的 TransactionManager 觸發交易同步。

高階同步方法

首選方法是使用 Spring 的最高階、基於範本的持久性整合 API,或是使用原生 ORM API 以及交易感知工廠 Bean 或代理來管理原生資源工廠。這些交易感知解決方案在內部處理資源的建立和重複使用、清理、資源的可選交易同步以及例外映射。因此,使用者資料存取程式碼不必處理這些任務,而可以專注於非樣板的持久性邏輯。一般來說,您會使用原生 ORM API,或採用範本方法進行 JDBC 存取,使用 JdbcTemplate。這些解決方案在本參考文件的後續章節中詳細說明。

低階同步方法

諸如 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 JdbcTemplatejdbc.object 套件來簡化 JDBC 的使用,則正確的連線檢索會在幕後發生,您無需編寫任何特殊的程式碼。

TransactionAwareDataSourceProxy

在最底層存在 TransactionAwareDataSourceProxy 類別。這是目標 DataSource 的代理,它封裝目標 DataSource 以增加對 Spring 管理的交易的感知。在這方面,它類似於 Jakarta EE 伺服器提供的交易 JNDI DataSource

您幾乎永遠不需要或想要使用此類別,除非必須調用現有程式碼並傳遞標準 JDBC DataSource 介面實作。在這種情況下,此程式碼有可能可用,但正在參與 Spring 管理的交易。您可以透過使用前面提到的更高階抽象來編寫新的程式碼。