当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
容器其实就是一个集合对象,该集合必须是线程安全的,不能两个线程拿到统一连接
该集合还必须实现队列的特性:先进先出
1.节约资源
2.用户访问高效
1.方法:获取连接
获取连接:getConnection()
归还连接:Connection.close()如果连接对象Connection是从连接池中获得的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接
1.C3P0:数据库连接池技术
2.Druid:数据库连接池实现技术,由阿里巴巴提供的
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连接池
从池中取一个连接使用
每次都会创建一个新的连接
创建了用完就关闭 渣男
CTRL+N进行查找
两个都继承了DataSource
找到getConnection
跟doGetConnection进去,发现在创建properties对象,传用户名密码
再跟进去,就发现了熟悉的DriverManager,我们先进入initializeDriver看
跟popConnection进去
如果为null,同步代码块,这一点为了线程安全
idleConnection空闲的connection如果是控(取反——空闲的连接还有的话
这里可以看一下idleConnection发现就是一个集合对象,印证了前面说的定义
先去看空闲有没有,有就去一个出来remove0
活动的连接池数量小于设定的最大值就可以创建一个连接
目前的意思是有空闲的就给你拿一个空闲的,没有的话就看一下连接池有没有位置,给你创建一个新的 都不满足的话就只有拿一个最老的(最先进来的)把他返回获取。
(觉得有帮助的话点个赞嘻嘻)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。