java数据库连接池简单实现

时间:2022-12-11 14:58:21
package cn.lmj.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.util.LinkedList;
import javax.sql.DataSource;


public class JdbcPool implements DataSource

{

//选用LinkedList方便移除链接

public static LinkedList<Connection> list = new LinkedList<Connection>();

static
{
try
{

Class.forName("com.mysql.jdbc.Driver");

//初始化20个链接

for(int i = 0;i<20;i++)
{

final Connection conn = DriverManager.getConnection("jdbc:mysql:///test","root","root");

//利用jdk动态代理实现增强Connection的close方法

Connection proxy = (Connection) Proxy.newProxyInstance(JdbcPool.class.getClassLoader(),conn.getClass().getInterfaces(),new InvocationHandler()
{
public Object invoke(Object obj, Method m, Object[] arg)
throws Throwable
{
if("close".equals(m.getName()))

{

//加到池*其他线程訪问

list.addLast(conn);
}

return m.invoke(conn,arg);
}
});
list.add(proxy);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}

public PrintWriter getLogWriter() throws SQLException
{
return null;
}


public int getLoginTimeout() throws SQLException
{
// TODO Auto-generated method stub
return 0;
}


public void setLogWriter(PrintWriter arg0) throws SQLException
{
// TODO Auto-generated method stub

}


public void setLoginTimeout(int arg0) throws SQLException
{
// TODO Auto-generated method stub

}


public boolean isWrapperFor(Class<?> arg0) throws SQLException
{
// TODO Auto-generated method stub
return false;
}


public <T> T unwrap(Class<T> arg0) throws SQLException
{
// TODO Auto-generated method stub
return null;
}


public Connection getConnection() throws SQLException
{
if(list.size()<=0)
{
new RuntimeException("数据库忙。稍后再来");
}

//移除第一个引用。不能用get,由于get不能移除引用

return list.removeFirst();
}


public Connection getConnection(String arg0, String arg1)
throws SQLException
{
// TODO Auto-generated method stub
return null;
}

}