JDBC(五)、连接池的分类及使用

线程池、数据库连接池都属于池化技术,为了减少跟操作系统之间的交互次数。

DBCP

commons-collections->commons-pool->commons-dbcp

池对象可以放很多[不只放连接],从网上读取的数据。依赖于集合。dbcp是数据库连接池[只能放数据库连接 database connection pool]依赖于pool对象。

BasicDataSourceFactory.createDataSource(properties);
  • DataSource可以用来取代DriverManager
  • 获取连接的速度快,不需要上下文切换(TCP\IP协议)
  • 通过DataSource获得的他的close已经是被修改过的。
  • 一般数据源内部都会有一个连接池(Collection)[访问权限一般是包内]
  • 一般只和数据源打交道,不会直接接触连接池

动态代理的方式生成连接

package com.BitterGourd.knowlegebase.daoDemo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;

/**
 * @Program: knowledge-base
 * @Description: ConnectionHandler
 * @Author: BitterGourd
 * @Date: 2020-01-17 20:18
 */
public class ConnectionHandler implements InvocationHandler {

    private Connection realConnection;
    private Connection warpedConnection;
    private DataSourcePool dataSourcePool;

    ConnectionHandler(DataSourcePool dataSourcePool){
        this.dataSourcePool = dataSourcePool;
    }

    Connection bind(Connection realConn){
        // 动态代理 需要 类加载器、实现的接口、调用处理器(实现InvocationHandler)
        this.realConnection = realConn;
        this.warpedConnection =
                (Connection) Proxy.newProxyInstance(this.getClass().getClassLoader(),
                new Class[]{Connection.class},this);
        return warpedConnection;  // 内存里面生成Class实现接口,对这个class的请求转发给处理器,
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if("close".equals(method.getName())){
            this.dataSourcePool.free(this.warpedConnection);
        }
        // 其他的都转发给真正的连接了 真正感兴趣的只有close方法
        return method.invoke(this.realConnection,args);
    }


    /*
    * DataSourcePool、增加连接数
    * 1. new 一个handler
    * 2. 调用bind,绑定一个 实例对象
    *
    * */

}

posted @ 2020-03-17 16:38  Biturd  阅读(3)  评论(0编辑  收藏  举报