前几次提到过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内置的增删改查。
如果有不对请指出,共同进步,谢谢!!!