数据库连接池

 _Connection.java

import java.lang.reflect.*;
import java.sql.*;

/**
 * 定义数据库连接的代理类 
 * @author ShaoJiang
 *
 */
public class _Connection implements InvocationHandler {
	// 定义连接
	private Connection conn = null;
	// 定义监控连接创建的语句
	private Statement statRef = null;
	private PreparedStatement prestatRef = null;
	// 是否支持事务标志
	private boolean supportTransaction = false;
	// 数据库的忙状态
	private boolean isFree = false;
	// 最后一次访问时间
	long lastAccessTime = 0;
	// 定义要接管的函数的名字
	String CREATESTATE = "createStatement";
	String CLOSE = "close";
	String PREPARESTATEMENT = "prepareStatement";
	String COMMIT = "commit";
	String ROLLBACK = "rollback";

	/** 
	 * 构造函数,采用私有,防止被直接创建 
	 * @param param 连接参数
	 */
	private _Connection(ConnectionParam param) {
		// 记录日至
		try {
			// 创建连接
			Class.forName(param.getDriver()).newInstance();
			conn = DriverManager.getConnection(param.getUrl(), param.getUser(),
					param.getPassword());
			DatabaseMetaData dm = null;
			dm = conn.getMetaData();
			// 判断是否支持事务
			supportTransaction = dm.supportsTransactions();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/*
	 * (non-Javadoc) * @see
	 * java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
	 * java.lang.reflect.Method, java.lang.Object[])
	 */
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object obj = null; 
		// 判断是否调用了close的方法,如果调用close方法则把连接置为无用状态
		if (CLOSE.equals(method.getName())) {
			// 设置不使用标志
			setIsFree(false);
			// 检查是否有后续工作,清除该连接无用资源
			if (statRef != null)
				statRef.close();
			if (prestatRef != null)
				prestatRef.close();
			return null;
		}
		// 判断是使用了createStatement语句
		if (CREATESTATE.equals(method.getName())) {
			obj = method.invoke(conn, args);
			statRef = (Statement) obj;// 记录语句
			return obj;
		}
		// 判断是使用了prepareStatement语句
		if (PREPARESTATEMENT.equals(method.getName())) {
			obj = method.invoke(conn, args);
			prestatRef = (PreparedStatement) obj;
			return obj;
		}
		// 如果不支持事务,就不执行该事物的代码
		if ((COMMIT.equals(method.getName()) || ROLLBACK.equals(method
				.getName())) && (!isSupportTransaction()))
			return null;
		obj = method.invoke(conn, args);
		// 设置最后一次访问时间,以便及时清除超时的连接
		lastAccessTime = System.currentTimeMillis();
		return obj;
	}

	/**
	 * 创建连接 
	 * @param pool 连接池 
	 * @param param 连接参数
	 * @return 连接
	 */
	static public _Connection getConnection(ConnectionPool pool,
			ConnectionParam param) {
		if (pool.isCreate())// 判断是否正确初始化连接池
		{
			_Connection _conn = new _Connection(param);
			return _conn;
		} else
			return null;
	}

	public Connection getFreeConnection() {
		// 返回数据库连接conn的接管类,以便截住close方法
		Connection proxyConn = (Connection) Proxy.newProxyInstance(conn.getClass()
				.getClassLoader(), conn.getClass().getInterfaces(), this);
		return proxyConn;
	}

	/**
	 * 该方法真正的关闭了数据库的连接 
	 * @throws SQLException 
	 */
	void close() throws SQLException { 
		// 由于类属性conn是没有被接管的连接,因此一旦调用close方法后就直接关闭连接
		conn.close();
	}

	public void setIsFree(boolean value) {
		isFree = value;
	}

	public boolean isFree() {
		return isFree;
	}

	/** 
	 * 判断是否支持事务 
	 * @return boolean 
	 */
	public boolean isSupportTransaction() {
		return supportTransaction;
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sjiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值