java – 如何在Spring事务中获得连接?

想象一下这段代码

foo() {
     Connection conn = ...;
}

已从具有注释@Transactional的方法调用foo().如何获取当前的JDBC连接?请注意,foo()在bean中(因此它可以有@Autowired字段)但foo()不能有参数(因此我无法从某处传递连接).

[编辑]我正在使用需要数据源或连接的jOOQ.我的问题:我不知道配置了哪个事务管理器.它可能是任何东西; Java EE,基于DataSource,通过JNDI获取数据源.我的代码不是应用程序,它是一个库.我需要吞下别人放在盘子里的东西.同样,我不能请求Hibernate会话工厂,因为使用我的应用程序可能不会使用Hibernate.

但我知道其他代码,如Spring Hibernate集成,不知何故可以从事务管理器获取当前连接.我的意思是,Hibernate不支持Spring的事务管理器,因此粘合代码必须使Spring API适应Hibernate所期望的.我需要做同样的事情,但我无法弄清楚它是如何工作的.

[EDIT2]我知道有一个活动事务(即Spring在某个地方有一个Connection实例,或者至少有一个事务管理器可以创建一个),但我的方法不是@Transactional.我需要调用一个构造函数,它将java.sql.Connection作为参数.我该怎么办?

最佳答案
(完全基于评论线程重写;不知道为什么我的原始答案专注于Hibernate,除了那是我现在正在使用的)

事务管理器与数据源完全正交.一些事务管理器直接与数据源交互,一些通过中间层(例如,Hibernate)交互,一些交互管理器通过容器提供的服务(例如,JTA)进行交互.

当你将方法标记为@Transactional时,所有这意味着Spring将在加载bean时生成代理,并且该代理将被传递给任何其他想要使用bean的类.当调用代理的方法时,它(代理)要求事务管理器为其提供未完成的事务或创建新的事务.然后它调用你的实际bean方法.当bean方法返回时,代理再次与事务管理器交互,要么说“我可以提交”,要么“我必须回滚”.这个过程有些曲折;例如,事务方法可以调用另一个事务方法并共享同一个事务.

当事务管理器与DataSource交互时,它不拥有DataSource.您不能要求事务管理器为您提供连接.相反,您必须注入一个将返回连接的特定于帧的对象(例如Hibernate SessionFactory).或者,您可以使用静态事务感知实用程序类,但这些类又与特定框架相关联.

相关文章

Spring Cloud为Spring Boot应用程序提供Netflix OSS集成。 提供的功能模块包括服务发现(Eureka),断路...
Spring Cloud 学习笔记;maven配置;入门学习;基于Spring Boot 实现;服务端配置,客户端配置;
可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的...
Spring中各种方式进行日期时间处理,有作用于单个实体的,也有作用于全局的,有作用于请求入参的,有作...
跨域资源共享(Cross-origin resource sharing)(CORS)是W3C的标准,大部分的浏览器都实现了这个标准...
Spring Boot使创建基于Spring的应用程序变得轻松,大部分的SpringBoot应用程序都只需要很少的Spring配置...