`
xiang37
  • 浏览: 415127 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Proxy JDBC Connection

阅读更多

使用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接口。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics