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