此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10! |
将资源与事务同步
如何创建不同的事务管理器以及如何将它们链接到相关资源
需要同步到事务(例如DataSourceTransactionManager
到 JDBCDataSource
,HibernateTransactionManager
到 HibernateSessionFactory
,
等等)现在应该很清楚了。本节介绍应用程序代码如何
(直接或间接地,通过使用 JDBC、Hibernate 或 JPA 等持久性 API)
确保正确创建、重用和清理这些资源。该部分
还讨论了如何(可选)通过
相关TransactionManager
.
高级同步方法
首选方法是使用 Spring 最高级别的基于模板的持久化
集成 API 或将本机 ORM API 与事务感知工厂 Bean 一起使用,或
用于管理本机资源工厂的代理。这些事务感知解决方案
内部处理资源创建复用、清理、可选事务
资源同步和异常映射。因此,用户数据访问代码确实如此
不必处理这些任务,但可以纯粹专注于非样板
持久性逻辑。通常,您使用原生 ORM API 或采用模板方法
用于 JDBC 访问,使用JdbcTemplate
.这些解决方案将在后续
本参考文档的各个部分。
低级同步方法
类,例如DataSourceUtils
(对于 JDBC),EntityManagerFactoryUtils
(对于JPA),SessionFactoryUtils
(对于 Hibernate),依此类推存在于较低级别。当您需要
应用程序代码直接处理本机持久化 API 的资源类型,
您使用这些类来确保获得正确的 Spring Framework 托管实例,
事务(可选)同步,进程中发生的异常是
正确映射到一致的 API。
例如,在 JDBC 的情况下,而不是传统的 JDBC 调用
这getConnection()
方法DataSource
,你可以改用 Spring 的org.springframework.jdbc.datasource.DataSourceUtils
类,如下所示:
Connection conn = DataSourceUtils.getConnection(dataSource);
如果现有事务已经同步(链接)了连接,则该
instance 返回。否则,方法调用会触发创建新的
connection,它(可选)与任何现有事务同步并进行
可在同一事务中进行后续重用。如前所述,任何SQLException
被包装在一个 Spring 框架中CannotGetJdbcConnectionException
一
Spring 框架的 unchecked 层次结构DataAccessException
类型。这种方法
为您提供的信息比从SQLException
和
确保跨数据库甚至跨不同持久化技术的可移植性。
这种方法也适用于没有 Spring 事务管理(事务 synchronization 是可选的),因此无论您是否使用 Spring 事务管理。
当然,一旦你使用了 Spring 的 JDBC 支持、JPA 支持或 Hibernate 支持,
您通常不喜欢使用DataSourceUtils
或其他辅助类,
因为你通过 Spring 抽象比直接工作更快乐
与相关 API 一起使用。例如,如果使用 SpringJdbcTemplate
或jdbc.object
包来简化您对 JDBC 的使用,从而进行正确的连接检索
在幕后,您无需编写任何特殊代码。
TransactionAwareDataSourceProxy
在最低级别存在TransactionAwareDataSourceProxy
类。这是一个
目标的代理DataSource
,它包装目标DataSource
增加对
Spring 管理的事务。在这方面,它类似于事务性 JNDIDataSource
,由 Jakarta EE 服务器提供。
您几乎永远不需要或想要使用此类,除非存在
代码必须被调用并传递标准 JDBCDataSource
接口实现。在
在这种情况下,此代码可能可用,但正在参与 Spring 管理
交易。您可以使用更高级别的
前面提到的抽象。