每次要访问数据库都要 先建立连接 执行操作 然后再 断开连接 回收资源 如果经常对数据库操作 则内存开销大
使用一次 连接一次
Q:放回连接池后的连接还能被再次利用吗
A:可以,只要保证连接池中有空闲的连接就能和数据库建立连接
每次要对数据库进行操作时就从连接池中取出一个连接 操作完成之后放回 方便快捷
**按需要获取连接 从连接池中获取一个连接 用完再放回 **
避免频繁的创建数据库连接,先创建多个联机放入连接池可以重复使用
不需要再从头建连接,直接从连接池中获取连接,减少了时间开销
可以直接在应用层管理连接池中的资源,使用JDBC的话则不能管理
可以统一的对连接池中的链接进行管理,能设置连接个数还能设置超时断开时间
使用连接池本质上的多个数据库建立连接的重用,重用性得到提高其连接的响应速度会更快,连接的效率更高,也更加方便管理
Q:建立的连接数量能超过所设定的最大值吗?
A:可以超过,有上限并不说明一定不能超过这个数量
比如上限是5个连接当连接需求增多时可以增加到6个(超过了最大连接限制)
Q:为什么可以超过,能超过最多是多少
A:当需要更多的连接时如果不能及时的提供则会造成访问时间长,可以超过但不能无限度的超过比如不能超过上线的30%
Q:minConn应该设置多少?设置的过多或过少会怎样
A:设置的多-启动时慢-响应快
设置的少-启动快-但可能因为连接不足造成执行速度缓慢 需要自行寻找饱 和点 权衡驱动时间和响应
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();
}
}
}
}
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);
}
}
}