此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

将资源与事务同步

如何创建不同的事务管理器以及如何将它们链接到相关资源 需要同步到事务(例如DataSourceTransactionManager到 JDBCDataSource,HibernateTransactionManager到 HibernateSessionFactory, 等等)现在应该很清楚了。本节介绍应用程序代码如何 (直接或间接地,通过使用 JDBC、Hibernate 或 JPA 等持久性 API) 确保正确创建、重用和清理这些资源。该部分 还讨论了如何(可选)通过 相关TransactionManager.spring-doc.cadn.net.cn

高级同步方法

首选方法是使用 Spring 最高级别的基于模板的持久化 集成 API 或将本机 ORM API 与事务感知工厂 Bean 一起使用,或 用于管理本机资源工厂的代理。这些事务感知解决方案 内部处理资源创建复用、清理、可选事务 资源同步和异常映射。因此,用户数据访问代码确实如此 不必处理这些任务,但可以纯粹专注于非样板 持久性逻辑。通常,您使用原生 ORM API 或采用模板方法 用于 JDBC 访问,使用JdbcTemplate.这些解决方案将在后续 本参考文档的各个部分。spring-doc.cadn.net.cn

低级同步方法

类,例如DataSourceUtils(对于 JDBC),EntityManagerFactoryUtils(对于JPA),SessionFactoryUtils(对于 Hibernate),依此类推存在于较低级别。当您需要 应用程序代码直接处理本机持久化 API 的资源类型, 您使用这些类来确保获得正确的 Spring Framework 托管实例, 事务(可选)同步,进程中发生的异常是 正确映射到一致的 API。spring-doc.cadn.net.cn

例如,在 JDBC 的情况下,而不是传统的 JDBC 调用 这getConnection()方法DataSource,你可以改用 Spring 的org.springframework.jdbc.datasource.DataSourceUtils类,如下所示:spring-doc.cadn.net.cn

Connection conn = DataSourceUtils.getConnection(dataSource);

如果现有事务已经同步(链接)了连接,则该 instance 返回。否则,方法调用会触发创建新的 connection,它(可选)与任何现有事务同步并进行 可在同一事务中进行后续重用。如前所述,任何SQLException被包装在一个 Spring 框架中CannotGetJdbcConnectionException一 Spring 框架的 unchecked 层次结构DataAccessException类型。这种方法 为您提供的信息比从SQLException和 确保跨数据库甚至跨不同持久化技术的可移植性。spring-doc.cadn.net.cn

这种方法也适用于没有 Spring 事务管理(事务 synchronization 是可选的),因此无论您是否使用 Spring 事务管理。spring-doc.cadn.net.cn

当然,一旦你使用了 Spring 的 JDBC 支持、JPA 支持或 Hibernate 支持, 您通常不喜欢使用DataSourceUtils或其他辅助类, 因为你通过 Spring 抽象比直接工作更快乐 与相关 API 一起使用。例如,如果使用 SpringJdbcTemplatejdbc.object包来简化您对 JDBC 的使用,从而进行正确的连接检索 在幕后,您无需编写任何特殊代码。spring-doc.cadn.net.cn

TransactionAwareDataSourceProxy

在最低级别存在TransactionAwareDataSourceProxy类。这是一个 目标的代理DataSource,它包装目标DataSource增加对 Spring 管理的事务。在这方面,它类似于事务性 JNDIDataSource,由 Jakarta EE 服务器提供。spring-doc.cadn.net.cn

您几乎永远不需要或想要使用此类,除非存在 代码必须被调用并传递标准 JDBCDataSource接口实现。在 在这种情况下,此代码可能可用,但正在参与 Spring 管理 交易。您可以使用更高级别的 前面提到的抽象。spring-doc.cadn.net.cn