连接池
是一个存储连接的容器
用于降低获取连接的开销
必须线程安全
先进先出
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规范