一.自定义连接池
实现思路
1.指定初始化连接数目,程序启动时就执行创建
2.指定最大连接数
3.指定当前使用的连接数(不能超过最大连接数)
代码实现:
1.连接池类
2.指定全局参数:初始化数目,最大连接数,当前连接,连接池集合
3.构造函数:循环创建三个连接
4.写一个创建连接的方法
5.获取连接
判断:
--池中有连接,直接拿
--池中没有连接,判断是否达到做大连接数;达到,抛出异常;没有达到最大连接数,创建新的连接
6.释放连接
连接放回集和中
自定义连接池
1.创建连接池中3个Connection连接
2.最大连接数6个
public class MyConnectionPool {
private int init_count = 3;//初始化链接数目
private int max_count = 6;//最大连接数
private int current_count = 0;//记录当前使用的连接数
//连接池:存放所有的初始化连接
private LinkedList<Connection> pool = new LinkedList<Connection>();
//1.构造函数,初始化连接放入连接池
public MyConnectionPool() {
for (int i = 0; i < init_count; i++) {
current_count++;//记录当前连接数
//把连接加到连接池
pool.addLast(creatConnection());
}
}
//2.创建一个新的连接方法
private Connection creatConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/car";//2.指定连接数据库的地址名称
String user="root";
String passWord = "root";//指定用户名和密码
return DriverManager.getConnection(url,user,passWord);//3获取数据库连接
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//3.获取连接
public Connection getConnection() {
//池中有连接,直接拿
if (pool.size() > 0) {
return pool.removeFirst();//将第一个list集合删除并返回
}
//池中没有连接,判断是否达到做大连接数;没有达到最大连接数,创建新的连接
if (current_count < max_count) {
//记录当前使用的连接数
current_count++;
//创建连接
return creatConnection();
}
//达到最大连接数,抛出异常;
throw new RuntimeException("当前已经达到最大连接数");
}
//4.释放连接
public void realeaseConnection(Connection conn){
//判断:连接池中数目如果小于初始化连接,就放入池中
if(pool.size()<init_count){
pool.addLast(conn);
}else{
try {
//关闭连接
current_count--;
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
-
测试
//测试连接
public static void main(String[] args){
MyConnectionPool pool = new MyConnectionPool();
System.out.println("连接池:"+pool.current_count);
Connection conn1 = pool.getConnection();
pool.getConnection();
pool.getConnection();
pool.getConnection();
pool.getConnection();
pool.getConnection();
pool.realeaseConnection(conn1);
pool.getConnection();
System.out.println("当前连接池中:"+pool.pool.size());
System.out.println("当前连接:"+pool.current_count);
}