zoukankan      html  css  js  c++  java
  • JDBC(五)、连接池的分类及使用

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

    DBCP

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

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

    BasicDataSourceFactory.createDataSource(properties);
    
    • DataSource可以用来取代DriverManager
    • 获取连接的速度快,不需要上下文切换(TCPIP协议)
    • 通过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,绑定一个 实例对象
        *
        * */
    
    }
    
    
  • 相关阅读:
    什么是API
    Maxiee的Vim入门日记(4)——安装windows下的Cscope
    将字符串变成大写----C++实现
    POJ 3254 炮兵阵地(状态压缩DP)
    UIKit和Core Graphics绘图(三)——绘制虚线,椭圆以及饼图
    CRC 模式及实现
    [HDU 1317]XYZZY[SPFA变形][最长路]
    poj 2155 Matrix
    [置顶] Application,Session,Cookie之Application对象
    [Todo] Java及C++ Exception整理
  • 原文地址:https://www.cnblogs.com/biturd/p/12623147.html
Copyright © 2011-2022 走看看