日期:2014-05-16  浏览次数:20414 次

几种Java数据库连接池实现(三)<1>
package pool;
import java.lang.reflect.*;
import java.sql.*;
/**
*
* 定义数据库连接的代理类
*
*/
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();
     &n