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,绑定一个 实例对象
        *
        * */
    
    }
    
    
  • 相关阅读:
    mysql用查询结果当删除的判断条件进行删除报错1093 You can't specify target table解决方法
    centos通过yum快速安装JDK1.8
    crontab运行python不生效,但是手动执行正常的问题和解决方案
    SyntaxError: '' string literal contains an unescaped line break
    Enable Audit log
    checkbox横向选择
    动态分列显示
    重置参数值为缺省值
    Reset running number
    查看是谁在使用SL(SyteLine)
  • 原文地址:https://www.cnblogs.com/biturd/p/12623147.html
Copyright © 2011-2022 走看看