Mybatis支持三种类型的数据源处理:JNDI、无连接池和有连接池功能数据源,有连接池功能是在无连接池功能的基础上增加了连接池的处理。
Mybatis的数据源管理是通过工厂模式实现,通过DataSourceFactory接口实现不同功能的数据源管理工厂。
一、 UnPooled
- UnpooledDataSourceFactory
通过SystemMetaObject(后续分析)反射注入属性
- UnpooledDataSource
1. 在加载时会将所有初始化的驱动存到registeredDrivers中
2. 通过对DriverManager类的源码分析可以看到,是从内部变量registeredDrivers中取已注册的驱动信息,这个驱动的注册是每一个数据库驱动程序完成的,下面是mysql的驱动注册调用链。
3. UnpooledDataSource由于是没有连接池,所以每次会新创建一个Connection,每次会包括三步:初始化驱动、创建Connection,配置事务级别和事务的自动提交。
1) 初始化驱动和创建Connection
在这里用了一个代理驱动内部类DriverProxy
2) 配置事务级别和事务的自动提交
二、 JNDI
JndiDataSourceFactory工厂直接从JNDI上下文InitialContext取数据库连接,此处略
三、 Pooled
连接池管理主要包括以下几个类
1. PooledConnection是一个动态代理对象自代理,当PooledDataSource取连接池中的Connection时取的是代理对象,而不是真实的Connction。当使用代理对象时主要是对Connection养老对象进行了代理,将其放入到连接池中。
2. PooledDataSource类是一个连接池对象,核心几个方法为
pushConnection方法是在PooledConnection代理时调用的
popConnection方法是在getConnection时使用的,取的就是一个代理连接
PoolState类用于封装PooledDataSource、idle和acitive的Connection,在PooledDataSource的pushConnection和popConnection中的操作都是针对这个类进行的。
下面重点分析一下pushConnection和popConnection这两个方法,这两个方法用到了生产者和消费者模式,由于连接没有单独的线程处理连接池的有效连接,所以在取放时会检查连接的有效性。