使用事务同步资源

如何创建不同的事务管理器以及它们如何与需要与事务同步的相关资源关联(例如将DataSourceTransactionManager与JDBC DataSourceHibernateTransactionManager与Hibernate SessionFactory等)现在应该是清楚的。本节描述了应用程序代码(直接或间接地,通过使用持久性API,如JDBC、Hibernate或JPA)如何确保这些资源被正确创建、重用和清理。本节还讨论了事务同步是如何(可选地)通过相关的TransactionManager触发的。

高级同步方法

首选方法是使用Spring的最高级基于模板的持久性集成API或者使用具有事务感知工厂bean或代理的本机ORM API来管理本机资源工厂。这些具有事务感知的解决方案在内部处理资源的创建和重用、清理、资源的可选事务同步以及异常映射。因此,用户数据访问代码无需处理这些任务,而可以纯粹专注于非样板的持久性逻辑。通常,您可以使用本机ORM API或通过使用JdbcTemplate来采用模板方法来访问JDBC。这些解决方案在本参考文档的后续部分中有详细介绍。

低级同步方法

在较低级别存在诸如DataSourceUtils(用于JDBC)、EntityManagerFactoryUtils(用于JPA)、SessionFactoryUtils(用于Hibernate)等类。当您希望应用程序代码直接处理本机持久性API的资源类型时,您可以使用这些类来确保获得适当的Spring Framework管理实例、(可选地)同步事务以及在过程中发生的异常被正确映射到一致的API。

例如,在JDBC的情况下,您可以使用Spring的org.springframework.jdbc.datasource.DataSourceUtils类,而不是传统的JDBC方法在DataSource上调用getConnection()方法,如下所示:

Connection conn = DataSourceUtils.getConnection(dataSource);

如果现有事务已经与连接同步(关联)在一起,那么将返回该实例。否则,该方法调用将触发创建新连接,该连接(可选地)与任何现有事务同步,并可供在同一事务中后续重用。正如前面提到的,任何SQLException都会被包装在Spring Framework的CannotGetJdbcConnectionException中,这是Spring Framework未经检查的DataAccessException类型层次结构之一。这种方法为您提供了比从SQLException中更容易获得的更多信息,并确保在数据库之间甚至在不同的持久性技术之间具有可移植性。

这种方法也可以在没有Spring事务管理的情况下工作(事务同步是可选的),因此无论您是否使用Spring进行事务管理,都可以使用它。

当然,一旦您使用了Spring的JDBC支持、JPA支持或Hibernate支持,通常您会更喜欢通过Spring抽象而不是直接使用相关API来工作。例如,如果您使用Spring的JdbcTemplatejdbc.object包来简化JDBC的使用,正确的连接检索将在后台进行,您无需编写任何特殊代码。

TransactionAwareDataSourceProxy

在最低级别存在TransactionAwareDataSourceProxy类。这是目标DataSource的代理,它包装了目标DataSource以添加对Spring管理事务的意识。在这方面,它类似于由Jakarta EE服务器提供的具有事务的JNDI DataSource

除非必须调用现有代码并传递标准的JDBC DataSource接口实现,否则您几乎永远不需要或希望使用此类。在这种情况下,可能可以使用此代码,但是它参与了Spring管理的事务。您可以通过使用前面提到的更高级别的抽象来编写新代码。