线程池、数据库连接池都属于池化技术,为了减少跟操作系统之间的交互次数。
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,绑定一个 实例对象
*
* */
}