package com.itheima.datasource;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import com.itheima.utils.JdbcUtil;
/**
* 引入Sun标准数据源接口 为了更多的人去用
* DataSource :javax.sql.DataSource
*
* @author wangli
*
*/
public class MyDataSource3 implements DataSource {
public static List<Connection> pool = new ArrayList<Connection>();//池子
private static int size=10;
public static void setSize(int size) {
MyDataSource3.size = size;
}
//初始化池中的连接
static{
try {
for (int i = 0; i < size; i++) {
pool.add(JdbcUtil.getConnection());
}
} catch (Exception e) {
e.printStackTrace();
}
}
//统一提供方法,用于从池中获取连接
public synchronized Connection getConnection(){
if(pool.size()>0){
final Connection con = pool.remove(0);//删除这个连接,因为别人不能此时不能再用它 final 用匿名内部类里 con代表数据连接池里的池连接接口
//代理模式 JDK自带的相应代理相关类
//Proxy动态代理相关类
//Proxy
// newProxyInstance(ClassLoader cl,Class<?>[] interfaces,InvocationHandler ih)
// ClassLoader :代表类加载器 被代理的对象用什么类加载器,代理对象就要用什么加载器
//interfaces :代表所实现的接口,被代理对象实现什么接口,代理对象就要实现什么接口
//InvocationHandler 处理器 就是要处理相关的緢节问题 一般有一个匿名内部类
//InvocationHandler 策略模式
Connection proxyConn = (Connection) Proxy.newProxyInstance(con.getClass().getClassLoader(), con.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("close".equals(method.getName())){
//对于close方法要改写 添加到池中
return pool.add(con);//加入池中
}else{
//对于其它方法,用mysql的connection对象的底层实现
return method.invoke(con, args); 被代理对象和,被代理对象的方法里的参数
}
}
}
);
return proxyConn;
}else{
throw new RuntimeException("池中无连接");
}
}
//还回一个连接到池中
public static void close(Connection con){
pool.add(con);//将这个连接回收到池中
}
@Override
public PrintWriter getLogWriter() throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public int getLoginTimeout() throws SQLException {
// TODO Auto-generated method stub
return 0;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
}
@Override
public Connection getConnection(String username, String password)
throws SQLException {
// TODO Auto-generated method stub
return null;
}
}