package com.rlovep.pool;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;
/**
* 自定义连接池, 管理连接
* 代码实现:
1. MyPool.java 连接池类,
2. 指定全局参数: 初始化数目、最大连接数、当前连接 连接池集合
3. 构造函数:循环创建3个连接
4. 写一个创建连接的方法
5. 获取连接
------> 判断: 池中有连接, 直接拿
------> 池中没有连接,
------> 判断,是否达到最大连接数; 达到,抛出异常;没有达到最大连接数,
没有达到创建新的连接
6. 释放连接
-------> 连接放回集合中(..)
*
*/
public class Mypool {
private int init_count = 3; // 初始化连接数目
private int max_count = 8; // 最大连接数
private int current_count = 0; // 记录当前连接数
//list存放连接:连接池
private LinkedList<Connection> pool=new LinkedList<>();
//构造函数,初始化连接池
public Mypool(){
for(int i=0;i<init_count;i++)
{
//记录当前的连接数
current_count++;
//创建连接对象并加入连接池
pool.add(createConnection());
}
}
//创建一个新的连接的方法
private Connection createConnection(){
try {
//使用mysql的驱动
Class.forName("com.mysql.jdbc.Driver");
//获得连接
final Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/day01?useUnicode=true&characterEncoding=UTF8",
"root", "126165");
//对connection建立代理
//对接口的close方法进行扩展,添加额外的用户需要的业务逻辑!
Connection proxy=(Connection)Proxy.newProxyInstance(connection.getClass().getClassLoader(),//类加载器
new Class[]{Connection.class},//获得对象的接口
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法返回值
Object result=null;
//当前执行方法的方法名
String methodName=method.getName();
//判断是否为close方法:
if("close".equals(methodName)){
System.out.println("执行close方法》》");
//连接放入连接池
pool.add(connection);
System.out.println("执行完close方法,当前连接放入连接池");
}else{
//调用目标对象方法
result=method.invoke(connection,args);
}
return result;
}
} );
return proxy;//返回代理连接;
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
//获得一个连接
public Connection getConnection(){
//如果连接池不为空,则直接拿
if(!pool.isEmpty()){
return pool.removeFirst();
}
//如果连接池为空,且当前小于最大连接数,就创建连接
if(current_count<max_count){
current_count++;
return createConnection();
}
//如果当前已经达到最大连接数,抛出异常
throw new RuntimeException("当前连接已经达到最大连接数目 !");
}
//释放连接:连接放回连接池中
public void realeaseConnection(Connection con) {
// 池的数目如果小于初始化连接,就放入池中
if(con==null)throw new RuntimeException("连接为空");
if (pool.size() < init_count){
pool.addLast(con);
} else {
current_count--;
}
}
public static void main(String[] args) {
Mypool pMypool=new Mypool();
System.out.println("当前连接数:"+pMypool.current_count);
//使用连接
Connection connection1 = pMypool.getConnection();
Connection connection2 = pMypool.getConnection();
Connection connection3 = pMypool.getConnection();
Connection connection4 = pMypool.getConnection();
Connection connection5 = pMypool.getConnection();
pMypool.realeaseConnection(connection1);
connection1=null;
pMypool.realeaseConnection(connection2);
connection2=null;
pMypool.realeaseConnection(connection3);
connection3=null;
pMypool.realeaseConnection(connection4);
connection4=null;
System.out.println("当前连接数:"+pMypool.current_count);
System.out.println("连接池:" + pMypool.pool.size()); // 0
}
}