Mybatis获取Connection

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

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

你可能感兴趣的:(Mybatis获取Connection)