
连接池
是一个存储连接的容器
用于降低获取连接的开销
必须线程安全
先进先出
MyBatis中的连接池
MyBatis连接池提供3种方式的配置
配置的位置:主配置文件SqlMapConfig.xml中dataSource标签,type属性表示采用何种连接池
type属性的取值:
POOLED - 采用传统的javax.sql.DataSource规范中的连接池
UNPOOLED - 采用传统的获取连接的方式,虽然也实现了javax.sql.DataSource接口,但没有使用池的思想(没有容器,每次用都重新获取一个连接)
JNDI - 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器能拿到的DataSource不同(如果不是web或maven的war工程,不能使用)
tomcat服务器采用dbcp连接池
POOLED和UNPOOLED对比
1 | <!--配置连接池--> |

1 | <!--配置连接池--> |

UNPOOLED源码分析
Command + O 搜索 PooledDataSource 和 UnpooledDataSource,可以发现都实现了DataSource接口

而这个DataSource实现javax.sql,即为jdbc规范中的连接池定义
其中一定会有getConnection()

找一下UnpooledDataSource中的getConnection()

调了doGetConnection()

最后获取连接的语句就是
1 | Connection connection = DriverManager.getConnection(url, properties); |
而initializeDriver()中就是反射注册驱动

所以,UNPOOLED使用时,会注册驱动、获取连接、返回连接
POOLED源码分析
也找到getConnection()

调了popConnection()

如果没有连接,在synchronized块中进行后续操作
锁的是这个state

继续,如果idleConnections非空

而idleConnections就是一个ArrayList

即,当它非空,取出第一个
如果为空,连接数量小于最大值,创建连接

如果已经到最大值了,取出一个最老的连接,尝试处理之后继续用
总的流程:

POOLED是MyBatis自己实现的一套连接池,根据javax.sql.DataSource规范