• 【JavaWeb】数据库连接池


    🔥 本文由 程序喵正在路上 原创,CSDN首发!
    💖 系列专栏:👉JavaWeb从入门到实战
    🌠 首发时间:2022年9月2日
    🦋 欢迎关注🖱点赞👍收藏🌟留言🐾
    🌟 一以贯之的努力 不得懈怠的人生

    数据库连接池


    1 - 概述

    数据库连接池是什么

    • 数据库连接池是一个容器,它负责分配、管理数据库连接
    • 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
    • 它会释放空闲时间超过最大空闲时间的数据库连接,以此来避免因为没有释放数据库连接而引起的数据库连接遗漏

    数据库连接池的优点

    • 资源重用
    • 提升系统响应速度
    • 避免数据库连接遗漏

    之前我们代码中使用连接都是创建一个 Connection 对象,使用完毕就将其销毁,这样重复创建销毁的过程,其实是特别耗费计算机的性能的及消耗时间的

    而数据库使用了数据库连接池后,就能达到 Connection 对象的复用,如下图

    在这里插入图片描述

    连接池是在一开始就创建好了一些连接(Connection对象存储起来。用户需要连接数据库时,不需要自己创建连接,而只需要从连接池中获取一个连接进行使用,使用完毕后再将连接对象归还给连接池

    这样就可以起到资源重用,也节省了频繁创建连接销毁连接所花费的时间,从而提升了系统响应的速度

    2 - 数据库连接池实现

    标准接口:DataSource

    DataSource 是官方(SUN) 提供的数据库连接池标准接口,由第三方组织实现此接口,该接口提供了获取连接的功能:

    Connection getConnection()
    
    • 1

    那么以后我们就不需要再通过 DriverManager 对象获取 Connection 对象,而是通过连接池获取 Connection 对象

    常见的数据库连接池

    • DBCP
    • C3P0
    • Druid

    我们现在使用更多的是Druid,它的性能比其他两个会好一些

    Druid(德鲁伊)

    • Druid 连接池是阿里巴巴开源的数据库连接池项目
    • 功能强大,性能优秀,是 Java 语言最好的数据库连接池之一

    3 - Driud使用

    使用步骤:

    1. 导入 jardruid-1.1.12.jar
    2. 定义配置文件
    3. 加载配置文件
    4. 获取数据库连接池对象
    5. 获取连接

    现在我们通过代码来实现,首先需要先将 Druidjar 包放到项目下的 lib 下并添加为库文件

    点击此处获取jar包

    jar 包添加到 lib 下:

    在这里插入图片描述

    添加为库文件,选择模块库:

    在这里插入图片描述

    在这里插入图片描述

    src 下添加一个类:

    在这里插入图片描述

    src 下新建一个配置文件 druid.properties,内容如下:

    在这里插入图片描述

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///db1?useSSL=false&useServerPrepStmts=true
    username=root
    password=1234
    # 初始化连接数量
    initialSize=5
    # 最大连接数
    maxActive=10
    # 最大等待时间
    maxWait=3000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    关于配置文件的参数,还有很多,具体参考下表:

    属性说明建议值
    url数据库的jdbc连接地址。一般为连接oracle/mysql。示例如下:
    mysql : jdbc:mysql://ip:port/dbname?option1&option2&…
    oracle : jdbc:oracle:thin:@ip:port:oracle_sid
    username登录数据库的用户名
    password登录数据库的用户密码
    initialSize启动程序时,在连接池中初始化多少个连接10-50已足够
    maxActive连接池中最多支持多少个活动会话
    maxWait程序向连接池中请求连接时,超过maxWait的值后,认为本次请求失败,即连接池100
    没有可用连接,单位毫秒,设置-1时表示无限等待
    minEvictableIdleTimeMillis池中某个连接的空闲时长达到 N 毫秒后, 连接池在下次检查空闲连接时,将见说明部分
    回收该连接,要小于防火墙超时设置
    net.netfilter.nf_conntrack_tcp_timeout_established的设置
    timeBetweenEvictionRunsMillis检查空闲连接的频率,单位毫秒, 非正整数时表示不进行检查
    keepAlive程序没有close连接且空闲时长超过 minEvictableIdleTimeMillis,则会执true
    行validationQuery指定的SQL,以保证该程序连接不会池kill掉,其范围不超
    过minIdle指定的连接个数。
    minIdle回收空闲连接时,将保证至少有minIdle个连接.与initialSize相同
    removeAbandoned要求程序从池中get到连接后, N 秒后必须close,否则druid 会强制回收该false,当发现程序有未
    连接,不管该连接中是活动还是空闲, 以防止进程不会进行close而霸占连接。正常close连接时设置为true
    removeAbandonedTimeout设置druid 强制回收连接的时限,当程序从池中get到连接开始算起,超过此应大于业务运行最长时间
    值后,druid将强制回收该连接,单位秒。
    logAbandoned当druid强制回收连接后,是否将stack trace 记录到日志中true
    testWhileIdle当程序请求连接,池在分配连接时,是否先检查该连接是否有效。(高效)true
    validationQuery检查池中的连接是否仍可用的 SQL 语句,drui会连接到数据库执行该SQL, 如果
    正常返回,则表示连接可用,否则表示连接不可用
    testOnBorrow程序 申请 连接时,进行连接有效性检查(低效,影响性能)false
    testOnReturn程序 返还 连接时,进行连接有效性检查(低效,影响性能)false
    poolPreparedStatements缓存通过以下两个方法发起的SQL:true
    public PreparedStatement prepareStatement(String sql)
    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
    maxPoolPrepareStatementPerConnectionSize每个连接最多缓存多少个SQL20
    filters这里配置的是插件,常用的插件有:stat,wall,slf4j
    监控统计: filter:stat
    日志监控: filter:log4j 或者 slf4j
    防御SQL注入: filter:wall
    connectProperties连接属性。比如设置一些连接池统计方面的配置。
    druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
    比如设置一些数据库连接属性

    使用 druid 的代码如下:

    /**
     * Druid数据库连接池演示
     */
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import javax.sql.DataSource;
    import java.io.FileInputStream;
    import java.sql.Connection;
    import java.util.Properties;
    
    public class DruidDemo {
        public static void main(String[] args) throws Exception {
            //1.导入jar包
            //2.定义配置文件
    
            //3. 加载配置文件
            Properties prop = new Properties();
            prop.load(new FileInputStream("jdbc_demo/src/druid.properties"));
    
            //4. 获取连接池对象
            DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
    
            //5. 获取数据库连接 Connection
            Connection connection = dataSource.getConnection();
            System.out.println(connection); //获取到了连接后就可以继续做其他操作了
        }
    }
    
    • 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

    在这里插入图片描述

  • 相关阅读:
    kafka安装
    设计模式—桥接模式
    C和指针 第14章 预处理器 14.2 #define
    软件测试:测试分类
    DataX 数据迁移
    [ vulhub漏洞复现篇 ] Jetty Utility Servlets ConcatServlet 双重解码信息泄露漏洞CVE-2021-28169
    Android发展历程
    (项目笔记)opencv人脸识别
    Logback原理及应用详解(十五)
    软件设计师2013上午题基础知识(易错整理)
  • 原文地址:https://blog.csdn.net/weixin_62511863/article/details/126461669