MyBatis笔记05 连接池
coconutnut

https://www.bilibili.com/video/av47952553
p39~43

连接池

是一个存储连接的容器

用于降低获取连接的开销

必须线程安全

先进先出

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
2
3
4
<!--配置连接池-->
<dataSource type="POOLED">
<!-- ... -->
</dataSource>
1
2
3
4
<!--配置连接池-->
<dataSource type="UNPOOLED">
<!-- ... -->
</dataSource>

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规范