• JDBC数据库连接池


    JDBC数据库连接池

    数据库连接池

    ​ 数据库连接池其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些请求对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

    ​ 简单总结:数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个,跟线程池有异曲同工之处

    使用数据库连接池好处

    1. 使用数据库连接池可以节省系统资源的开销,节约资源
    2. 加快了用户访问数据库数据的速度,使得用户访问更为高校

    数据库连接池影响因素

    最小连接数

    ​ 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。

    最大连接数

    ​ 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。

    最小连接数和最大连接数的差距

    ​ 最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

    评价数据库连接池性能指标

    请求阻塞概率

    ​ 求阻塞概率是衡量一个数据库连接池系统服务质量的重要指标。若请求阻塞概率过高,则应为系统配置更高的最大连接数。

    系统平均连接数

    ​ 系统平均连接数反映了系统运行稳定后系统的实际并发用户数,它为数据库连接池技术配置参数提供了重要理论依据。

    系统利用率

    ​ 系统利用率,即连接用户数与连接池可建立的最大连接数的比。系统利用率的高低直接关系系统资源的使用情况,分析系统利用净的影响因素,对数据库连接池技术的参数配置有着重要参考意义。

    系统吞吐量

    ​ 系统吞吐量直接反映整个系统处理连接请求的能力,是衡量系统性能的重要指标。

    JDBC数据库连接池实现

    标准接口

    Java数据库连接池标准接口:DataSource Javax.sql包下

    常用方法
    • 获取连接:getConnection()
    • 归还连接:如果连接对象Connection是从连接池中获取的,那么则调用Connection.close()方法,不会像原先JDBC一样再关闭连接了,而是归还连接
    Java开源数据库连接池
    • C3P0:一个古老的数据库连接池技术,开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSources 对象。
    • Druid:新版的数据库连接池实现技术,Druid不仅是一个数据库连接池,还包含一个ProxyDriver、一系列内置的JDBC组件库、一个SQL Parser。支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等。值得注意的是,Druid是阿里众多优秀开源项目中的一个。它除了提供性能卓越的连接池功能外,还集成了SQL监控,黑名单拦截等功能,用它自己的话说,Druid是“为监控而生”。

    注: 无论使用哪种数据库连接池,数据库连接的基本驱动jar包都是必须且基础需要的

    C3P0数据库连接池

    使用步骤
    1. 导入jar包(2个):c3p0 jar包mchange-commons jar包不要忘记导入数据库驱动jar包
    2. 定义配置文件:
      • 名称:c3p0.properties 或者 c3p0-config.xml
      • 路径:直接将文件放在src目录下即可
    3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
    4. 获取连接:getConnection
    5. 归还连接:close

    Druid数据库连接池

    ​ 阿里技术团队提供,相较于其他产品,中文文档比较全面

    使用步骤
    1. 导入jar包:druid jar包不要忘记导入数据库驱动jar包
    2. 定义配置文件:
      • 配置文件是.properties形式的
      • 配置文件可以叫任意名称吗,可以放在任意目录下
    3. 获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory.createDataSource()
      • 先加载配置文件
      • 在输入流中传入配置文件(.properties)
      • DruidDataSourceFactory.createDataSource()中传入Properties对象,该方法返回DataSource对象
    4. 获取连接:getConnection
    定义工具类
    1. 定义一个类 JDBCUtils
    2. 提供静态代码块加载配置文件,初始化连接池对象
    3. 提供方法
      1. 获取连接方法:通过数据库连接池获取连接
      2. 释放资源
      3. 获取连接池方法
    /*
     * Druid连接池的工具类
     */
    public class JDBCUtils {
        
        // 1. 定义成员变量 DataSource
        private static DataSource ds;
        
        static {
            try {
                // 1. 加载配置文件
                Properties pro = new Properties();
           		pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
                // 2. 获取DataSource
                ds = DruidDataSourceFactory.createDataSource(pro);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        // 获取连接
        public static Connection getConnection() throws SQLException {
            return ds.getConnection();
        }
        
        // 释放资源
        public static void close(Statement stmt, Connection conn) {
            if(stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            
            if(conn != null) {
                try {
                    conn.close(); // 归还连接
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        
        public static void close(ResultSet rs, Statement stmt, Connection conn) {
            if(rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            
            if(stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            
            if(conn != null) {
                try {
                    conn.close(); // 归还连接
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        
        // 获取连接池方法
        public static DataSource getDataSource() {
            return ds;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
  • 相关阅读:
    青菜学蒸馒头
    企业为何要挖掘专利和专利布局,如何做?
    367. 有效的完全平方数
    CSRF漏洞利用与防御
    skywalking功能介绍
    SSM公司企业绩效考核管理系统
    SpringBoot结合MyBatis实现多数据源配置
    浅谈继承之默认成员函数
    【Vue】数据表格增删改查与表单验证
    PostgreSQL 13支持增量排序(Incremental Sorting)
  • 原文地址:https://blog.csdn.net/weixin_51958878/article/details/127434717