package 动态连接数据库;
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.util.LinkedList;
public class UtilsDB {
public static void main(String[] args) {
UtilsDB u = new UtilsDB();
System.err.println(u.getCon());
}
private static LinkedList<Connection> pool = new LinkedList<Connection>();
static {
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql:///abc";
for (int i = 0; i < 3; i++) {
// 真实对象
final Connection con = DriverManager.getConnection(url, "root",
"1234");
// 声明代理
Object obj = Proxy.newProxyInstance(
UtilsDB.class.getClassLoader(),
new Class[] { Connection.class },
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
if (method.getName().equals("close")) {
System.err.println("有人还连接");
synchronized (pool) {
pool.addLast((Connection) proxy);
pool.notifyAll();
return null;
}
} else {
return method.invoke(con, args);
}
}
});
// 将代理人添加到pool
pool.add((Connection) obj);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static Connection getCon() {
synchronized (pool) {
if (pool.size() == 0) {
try {
pool.wait();
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
return getCon();
} else {
Connection con = pool.removeFirst();
System.err.println("pool.size:" + pool.size());
return con;
}
}
}
}
package 动态连接数据库;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
public class TestDb {
public static void main(String[] args) {
//Connection con=UtilsDB.getCon();
//System.err.println(con);
for (int i = 0; i < 110; i++) {
new Thread() {
public void run() {
Connection con = UtilsDB.getCon();
try {
Statement st = con.createStatement();
System.err.println(con + "\t" + this.getName() + "\t"
+ st);
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}.start();
}
}
}