Mybatis获取Connection

本文详细介绍了如何在Mybatis中获取数据库连接,包括配置、使用及常见问题解析,为Java开发者提供实用的数据库操作指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几次提到过DataSource是怎么生成的,这次看下是怎么获取Connection,mybatis的是怎么实现的连接池的。
前面也说过在生成DefaultSqlSession的时候,会生成一个CachingExecutor,在CachingExecutor中会有个代理的Executor,如果不指定的话默认是SimpleExecutor,如图1:
图1
在看下CachingExecutor的构造函数,如图2:
图2
现在在CachingExecutor中的代理就是SimpleExecutor。
SimpleExecutor有个私有方法prepareStatement,如图3:
图3
这里就是获取数据库连接,这个getConnection方法是在父类BaseExecutor中,如图4:
图4
可以看到是通过Transaction来获取Connection的,如图5:
图5
在Transaction是通过DataSource来获取Connection的,这里DataSource在前面已经说过,所以不再说明了,如图6:
图6
可以看到调用了内部的popConnection方法,这个方法就是获取Connection方法,并实现了线程池如图7:
图7(代码太长,分几次截图)
这其中是通过PoolState来实现线程池,在PoolState中有两个List,分别放入等待的连接和活跃的连接,如图8:
图8
如果还没有生成过Connection的,或者活跃的Connection小于最大活跃数,就会生成一个Connection,如图9:
图9
这里的dataSource.getConnection就是标准的获取Connection,就不展示了。
其余的就是各种判断,判断是否在idleConnections中Connection,如果有就直接获取第一个;判断第一个活跃的Connection查询时间和设置的超时时间来获取Connection,这里就不一一展示了。
 
接下来看下的是怎么归还Connection到idleConnections中。
在不考虑整合其他连接池的情况下,单独使用mybatis最后都是需要关闭SqlSession,其实说白了就是关闭Connection,那我们看下Connection在初始化的时候做了什么,如图10:
图10
能看到这里做了一个代理,自己代理自己,那直接看下代理的方法,如图11:
图11
在识别到close方法后会调用pushConnection方法,如图12:
图12
先获取Connection,在放入PoolState的activeConnections中,用完了调用close方法,在放入PoolState的idleConnections。
 
下次在来看下mybatis内置的增删改查。
 
如果有不对请指出,共同进步,谢谢!!!

转载于:https://www.cnblogs.com/shenqiaqia/p/10383914.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值