【Mybatis源码分析】Mybatis源码分析-数据库连接池

来源:互联网 发布:parallels mac 破解版 编辑:程序博客网 时间:2024/05/29 16:00

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这两个方法,这两个方法用到了生产者和消费者模式,由于连接没有单独的线程处理连接池的有效连接,所以在取放时会检查连接的有效性。

 

原创粉丝点击