此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
将资源与事务同步
如何创建不同的事务管理器以及它们如何链接到相关资源
需要同步到事务(例如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 返回。否则,方法调用会触发创建新的
连接,该连接(可选)与任何现有事务同步并进行
可在同一交易中供后续重用。如前所述,任何SQLException
包装在 Spring 框架中CannotGetJdbcConnectionException
一
Spring 框架的层次结构的 uncheckedDataAccessException
类型。这种方法
提供的信息比从SQLException
和
确保跨数据库甚至跨不同持久性技术的可移植性。
这种方法也可以在没有 Spring 事务管理(事务 synchronization 是可选的),因此无论您是否使用 Spring 事务管理。
当然,一旦您使用了 Spring 的 JDBC 支持、JPA 支持或 Hibernate 支持,
您通常不喜欢使用DataSourceUtils
或其他帮助程序类
因为您通过 Spring 抽象工作比直接使用 Spring 抽象要高得多
使用相关的 API。例如,如果您使用 SpringJdbcTemplate
或jdbc.object
package 来简化 JDBC 的使用,则会发生正确的连接检索
在幕后,您无需编写任何特殊代码。
TransactionAwareDataSourceProxy
在最低级别存在TransactionAwareDataSourceProxy
类。这是一个
目标的代理DataSource
,它将目标DataSource
要添加对
Spring 管理的事务。在这方面,它类似于事务性 JNDIDataSource
,由 Jakarta EE 服务器提供。
您几乎永远不需要或不想使用此类,除非存在
code 必须调用并传递标准 JDBCDataSource
interface 实现。在
在这种情况下,此代码可能可用,但参与 Spring 管理
交易。您可以使用更高级别的
abstractions 的