package com.mysql.utils;
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.logging.Logger;
import javax.sql.DataSource;
public class DatabaseSource implements DataSource {
// 声明一个池管理对象
private LinkedList pool = new LinkedList();
// 在初始化这个类子类时在构造方法中实现设置多个连接
public DatabaseSource() {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:1306/mydb1?useUnicode=true&characterEncoding=UTF-8";
for (int i = 0; i < 3; i++) {
final Connection conn = DriverManager.getConnection(url,
"root", "root");
Object proxyConn = Proxy.newProxyInstance(
DatabaseSource.class.getClassLoader(),
new Class[]{Connection.class}, new InvocationHandler() {
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
if (method.getName().equals("close")) {
synchronized (pool) {
pool.addLast((Connection) proxy);
pool.notify();
}
return null;
}
Object returnValue = method.invoke(conn, args);
return returnValue;
}
});
// 放入连接池
pool.add((Connection) proxyConn);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
}
}
public Connection getConnection() throws SQLException {
synchronized (pool) {
if (pool.size() == 0) {
try {
pool.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
return getConnection();
}
return pool.removeFirst();
}
}
@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 unwrap(Class iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isWrapperFor(Class