使用事务同步资源
如何创建不同的事务管理器以及它们如何与需要与事务同步的相关资源关联(例如将DataSourceTransactionManager
与JDBC DataSource
、HibernateTransactionManager
与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的JdbcTemplate
或jdbc.object
包来简化JDBC的使用,正确的连接检索将在后台进行,您无需编写任何特殊代码。