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

前端之家收集整理的这篇文章主要介绍了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相关文章