数据库连接池的作用:
1. 资源重用
当多个用户频繁的去对数据库进行读写操作时,会不间断的创建Connection,在数据库开始读写数据之前,把资源过多的分配给创建连接释放连接上,这笔开销得不偿失.数据库连接池的对连接Connection的资源回收机制对此做出了优化
2. 更快的系统响应速度
数据库连接池一旦初始化,用户获取的Connection不再创建新的,而是从现有的容器里面取,使得直接利用成为可能,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
3. 新的资源分配手段
对于多应用共享同一数据库的系统而言 ,某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。
4. 统一的连接管理,避免数据库连接泄漏
数据库连接池提供连接超时设定,超时后会重试,针对用户获取到的不健康的Connection,同样会重新分配新的连接,从而避免了常规数据库连接操作中可能出现的资源泄漏
实现一个简单的数据库连接池
目标:
- 要实现的数据库连接池,统一注册驱动(替换每一次连接数据库都要注册驱动的时代)
- 用户想对数据库进行进一步的操作,需要在数据库连接池中获取连接Connection
- 用户对队数据库读写完毕之后, 连接池回收当前的Connection
两个容器
数据库连接池 = 空闲连接池 + 工作连接池
三个重要的参数
- 最大连接数
- 最大连接数是对Connection总数的限制 一般是((核心数 * 2) + 有效磁盘数)
- 空闲连接数
- 空闲连接数 表示当前的空闲连接池中的Connection的数量,我们给他规定最大值和最小值
- 当前值 < 最大连接数 表示用户有机会获取连接
- 如果 空闲连接池的size>0 直接获取连接
- 否则 创建一个新的Connection给用户
- 当前值 >= 最大连接数 Connection的创建达到了上限,用户只能等待重试
- 工作连接数
- 工作连接数 表示 当前工作连接池中的Connection的数量
获取连接经历什么?
- 空闲连接池中的弹出一个Connection
- 把当前的Connection加入到工作连接池
连接是如何被回收的?
- 如果空闲连接池未满.直接添加进去
- 把工作连接池中相应的连接移除
- 如果空闲连接池满了.直接close()掉
- 把工作连接池中相应的连接移除
配置文件读取工具类
1 | public class propertiesUtil { |
定义接口,规范我们的连接池的方法
1 | public interface myConnectionPool { |
具体的实现类实现myConnectionPool接口
1 | public class ConnectionPool implements IConnection { |
配置文件
1 | # 数据库相关 |