一、连接池
1.概念:其实就是一个容器(集合),存放数据库连接的容器。
当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
容器其实就是一个集合对象,该集合必须是线程安全的,不能两个线程拿到统一连接
该集合还必须实现队列的特性:先进先出
2.好处:
1.节约资源
2.用户访问高效
3.实现:
1.标准接口:DataSource javax.sql包下的
1.方法:获取连接
获取连接:getConnection()
归还连接:Connection.close()如果连接对象Connection是从连接池中获得的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接
2.一般我们不去实现它,有数据库厂商来实现
1.C3P0:数据库连接池技术
2.Druid:数据库连接池实现技术,由阿里巴巴提供的
二、Mybatis连接池
Mybatis 中也有连接池技术,但是它采用的是自己的连接池技术。
有三种方式的配置:
配置的位置:
在Mybatis的主配置文件SqlMapConfig.xml 配置文件中的dataSource标签,type属性就是表示采用何种连接池方式。
type属性的取值:POOLED 传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现UNPOOLED 采用传统的获取连接的方式,虽然也实现了javax.sql.DataSource接口,但是并没有使用池的思想JNDI 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到的dataSource是不同的。注意:如果不是web或者maven的war工厂,是不能使用的。经常使用的tomcat服务器,采用连接池就是dbcp连接池
三、POOLED与UNPOOLED结果对比
POOLED
从池中取一个连接使用
UNPOOLED
每次都会创建一个新的连接
创建了用完就关闭 渣男
四、POOLED与UNPOOLED代码比较
MyBatis内部分别定义了实现了java.sql.DataSource接口的 UnpooledDataSource,PooledDataSource类来表示UNPOOLED、POOLED类型的数据源。
CTRL+N进行查找
两个都继承了DataSource
UNPOOLED配置连接池分析
找到getConnection
跟doGetConnection进去,发现在创建properties对象,传用户名密码
再跟进去,就发现了熟悉的DriverManager,我们先进入initializeDriver看
- initializeDriver负责组成驱动
- 创建连接
- 返回连接
这就是UNPOOLED,每次都会注册驱动,获取连接,返回连接
POOLED配置连接池分析
跟popConnection进去
代码解释
如果为null,同步代码块,这一点为了线程安全
idleConnection空闲的connection如果是控(取反——空闲的连接还有的话
这里可以看一下idleConnection发现就是一个集合对象,印证了前面说的定义
先去看空闲有没有,有就去一个出来remove0
活动的连接池数量小于设定的最大值就可以创建一个连接
目前的意思是有空闲的就给你拿一个空闲的,没有的话就看一下连接池有没有位置,给你创建一个新的
都不满足的话就只有拿一个最老的(最先进来的)把他返回获取。
pooled总的来说就是:
- 先去看空闲池有没有
- 再去看活动池是否到达最大数量,没达到就创建一个连接
- 活动池也满了就找活动池中最先进来的拿来设置和清理
(觉得有帮助的话点个赞嘻嘻)