spring 数据源是怎么知道什么时候应该释放或者归还连接的

问题描述

当使用 spring 数据源连接的时候, 被告知 @Transaction 实现原理是因为使用的同一个连接, 那连接打开总得释放或者归还连接池吧.

但是如果在方法结束时关闭连接, 这只是一个被调用方法, 后面就得打开一个新连接了, 那就不同一个事务

当前方法不可能知道这个事务是否已经结束了, 是否还有调用者也加了 @Transaction 注解,

当然, 获取连接是第一个 @Transaction 或者之前就已经获取到连接了 , 将当前连接绑定到当前线程, 那是什么时候来关闭呢

是哪个地方获取的连接, 就由哪个方法执行结束来关闭吗

问题出现的环境背景及自己尝试过哪些方法

尝试过了看源码 , 找必应查询了大量资料


回答:

DefaultTransactionStatus.newTransaction,这个字段决定了当前这个方法是否需要提交事务(基本上我们的应用场景,第一个加事务注解的方法,此方法需要加获取连接,提交事务,此时他就是true)

这是已存在事务的处理,明显看到这个字段是false

对于aop来说,它则是不管你是什么情况,都会走到事务提交的方案里面,

这里就会判断你是不是新事务,是才会给你提交事务

然后是释放连接,释放的话,相对特殊点,它是通过注册的TransactionSynchronization去触发释放连接的操作,

这里也能反驳你说你不知道当前方法不知道这个事务是否已经结束,你既然知道一个事务复用connect,如果我没有connect,是不是在一定程度上,我可以判断,当前事务已结束


回答:

c> 是哪个地方获取的连接, 就由哪个方法执行结束来关闭吗

是的,@Transaction事务切面就是在方法开始前拿连接开始事务,方法执行完提交事务释放连接

以上是 spring 数据源是怎么知道什么时候应该释放或者归还连接的 的全部内容, 来源链接: utcz.com/p/944271.html

回到顶部