数据库连接池
为什么使用连接池
使用JDBC和数据库建立连接的方式
- 建立连接
- 执行对数据库的操作
- 关闭连接
- 回收资源
每次要访问数据库都要 先建立连接 执行操作 然后再 断开连接 回收资源 如果经常对数据库操作 则内存开销大
使用一次 连接一次
使用连接池和数据库建立连接
- 创建连接池(只需要执行一次)
- 从连接池获取连接
- 执行对数据库的操作
- 将连接放回连接池
Q:放回连接池后的连接还能被再次利用吗
A:可以,只要保证连接池中有空闲的连接就能和数据库建立连接
每次要对数据库进行操作时就从连接池中取出一个连接 操作完成之后放回 方便快捷
**按需要获取连接 从连接池中获取一个连接 用完再放回 **
使用连接池的好处
- 提高资源的重用性(主要原理)
避免频繁的创建数据库连接,先创建多个联机放入连接池可以重复使用
- 响应速度更快
不需要再从头建连接,直接从连接池中获取连接,减少了时间开销
- 新的资源分配
可以直接在应用层管理连接池中的资源,使用JDBC的话则不能管理
- 统一的资源管理
可以统一的对连接池中的链接进行管理,能设置连接个数还能设置超时断开时间
使用连接池本质上的多个数据库建立连接的重用,重用性得到提高其连接的响应速度会更快,连接的效率更高,也更加方便管理
连接池原理
建立连接池
- 建立若干和数据库的连接
- 将建立的联机放入容器中
对连接池的管理(核心)
- 和线程相配合
- 可以设置最大等待时间 到时间强制关闭连接 抛出异常
- 建立连接先需要先判断是否达到了设定的最大值
Q:建立的连接数量能超过所设定的最大值吗?
A:可以超过,有上限并不说明一定不能超过这个数量
比如上限是5个连接当连接需求增多时可以增加到6个(超过了最大连接限制)
Q:为什么可以超过,能超过最多是多少
A:当需要更多的连接时如果不能及时的提供则会造成访问时间长,可以超过但不能无限度的超过比如不能超过上线的30%
连接池的关闭
- 关闭连接池的时间是 整个程序退出时
连接池的配置
- 主要的配置是minConn和maxConn用来限制连接池的数量
- minxConn 是启动时要建立的连接数量
- maxConn是 最大的建立的连接数量
Q:minConn应该设置多少?设置的过多或过少会怎样
A:设置的多-启动时慢-响应快
设置的少-启动快-但可能因为连接不足造成执行速度缓慢 需要自行寻找饱 和点 权衡驱动时间和响应
自定义数据库连接池
java
package come.example.jdbc.chapter02;
import java.sql.Connection;
/**
* @Classname TestMyConnectionPool
* @Description 测试自定义连接池
* @Author Jay lan
* @Date 2023/9/12 20:21
* @Version 1.0.0
*/
public class TestMyConnectionPool {
public static void main(String[] args) {
for (int i = 0; i < 6; i++) {
try {
// 从连接池获取连接
Connection connection=MyConnectionPool.getConnection();
// 使用获取到的链接
System.out.println("获取到的第"+i+"个连接为:"+connection);
// 将连接放回连接池
MyConnectionPool.releaseConnection(connection);
}catch (Exception e)
{
e.printStackTrace();
}
}
}
}
java
package come.example.jdbc.chapter02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.LinkedList;
/**
* @Classname MyConnectionPool
* @Description 自定义的数据库连接池
* @Author Jay lan
* @Date 2023/9/11 11:39
* @Version 1.0.0
*/
public class MyConnectionPool {
// 创建一个存储Connection兑现的List作为连接池
private static final LinkedList<Connection> myPool = new LinkedList<Connection>();
// 建立三个连接并放入连接池
static {
try {
for (int i = 0; i < 3; i++) {
// 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 获取JDBC连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/chapter01","root","Xi233");
// 将连接放入连接池(存放Connection的List)
myPool.add(connection);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @return Connection对象(连接)
* @Description 从连接池中获取一个连接
*/
public static Connection getConnection() {
// removeFirst()从集合中移除第一个元素并将其返回
// getFirst()则是取出第一个元素不将其从集合中移除
return myPool.removeFirst();
}
/**
* @param connection 要释放的连接
* @Description 释放一个连接将放回连接池
*/
public static void releaseConnection(Connection connection) {
if (connection != null) {
myPool.add(connection);
}
}
}
常用的连接池
- CP30-开源
- DBCP连接池-Apache组织,开源,适合服务器,独立的应用程序
- Druid连接池-国产,阿里巴巴,开源