使用事务同步资源
现在应该清楚如何创建不同的事务管理器以及它们如何与需要同步到事务的相关资源(例如,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 的使用,正确的连接检索会在幕后进行,您无需编写任何特殊代码。