package org.com.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.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;
import javax.sql.DataSource;
public class DataSourceDemo {
public static void main(String[] args) throws SQLException {
DataSource myDataSource = new MyDataSource();
Connection connection = myDataSource.getConnection();
connection.close();
System.out.println(connection);
}
}
class MyDataSource extends DataSourceAdapter {
private final List<Connection> POOL = new LinkedList<>();
{
try {
Class.forName("com.mysql.jdbc.Driver");
for (int i = 0; i < 10; i++) {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/world", "root",
"root");
Connection newProxyInstance = (Connection) Proxy.newProxyInstance(MyDataSource.class.getClassLoader(), new Class<?>[] { Connection.class },
new MyInvocationHandler(connection, POOL));
POOL.add(newProxyInstance);
}
System.out.println("连接池初始化成功");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public Connection getConnection() throws SQLException {
if (POOL.isEmpty()) {
System.out.println("无连接可用");
return null;
}
Connection remove = POOL.remove(0);
System.out.println("还剩 :" + POOL.size() + "个连接");
return remove;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
class MyInvocationHandler implements InvocationHandler {
private Connection connection;
private List<Connection> POOL;
public MyInvocationHandler(Connection connection, List<Connection> POOL) {
this.connection = connection;
this.POOL = POOL;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals("close")) {
POOL.add(connection);
System.out.println("回收连接,连接池数量:" + POOL.size());
return null;
}
return method.invoke(connection, args);
}
}
class DataSourceAdapter implements DataSource {
@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 Logger getParentLogger() throws SQLFeatureNotSupportedException {
// TODO Auto-generated method stub
return null;
}
@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() throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}