使用jdbc访问数据库,少不了DataSource的配置
package com.xiva.jdbc.demo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.LinkedList; import com.xiva.jdbc.exception.DaoException; public class MyDataSource { private static String url = "jdbc:mysql://localhost:3306/xivadata"; private static String user = "root"; private static String password = "njusc123"; private int initCount = 5; private int maxFreeCount = 20; private int maxCount = 50; public int CurrentCount = initCount; LinkedList<Connection> connPool = new LinkedList<Connection>(); public MyDataSource(){ for(int i=0;i<initCount;i++){ connPool.addLast(createConnection()); } } public Connection createConnection(){ Connection conn = null; try{ conn = DriverManager.getConnection(url, user, password); } catch(SQLException e){ throw new DaoException(); } MyConnectionHandler proxy = new MyConnectionHandler(this); return proxy.bind(conn); } public Connection getConnection() throws SQLException{ Connection conn = null; //为了线程安全 synchronized (connPool) { if(connPool.isEmpty()){ if(CurrentCount<maxCount){ System.out.println(CurrentCount); conn = createConnection(); CurrentCount++; } else{ throw new SQLException("Out of pool size!"); } } else{ conn = connPool.removeFirst(); } } return conn; } public void free(Connection conn){ if(connPool.size()<maxFreeCount){ connPool.addLast(conn); } else{ try { conn.close(); } catch (SQLException e) { throw new DaoException("free failure"); } } } }
有了dataSource,下面来代理他的Connection对象:
package com.xiva.jdbc.demo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
public class MyConnectionHandler implements InvocationHandler{
//代理方式,所谓代理模式可以这样解释:为其他对象提供一种代理以控制对这个对象的访问。
private Connection warpedConnetion;//代理对象
private Connection realConnetion;//被代理的对象
private MyDataSource dataSource;
private int initCount = 5;
private int maxCount = 50;
private int CurrentCount = initCount;
MyConnectionHandler(MyDataSource dataSource){
this.dataSource = dataSource;
}
Connection bind(Connection realConn){
this.realConnetion = realConn;
this.warpedConnetion = (Connection)Proxy.newProxyInstance(this.getClass().getClassLoader(),
new Class[]{}, this);
return warpedConnetion;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
if("close".equals(method.getName())){
this.CurrentCount++;
if(this.CurrentCount < this.maxCount){
this.dataSource.connPool.addLast(warpedConnetion);
}else{
this.realConnetion.close();
this.dataSource.CurrentCount--;
}
}
return method.invoke(realConnetion, args);
}
}
使用这种缓存机制,可以加大访问数据库的速度。当然这也是一般数据源(DataSource)的作用。
代码中,有一个需要注意到的知识就是:InvocationHandler接口。