• JAVA - 数据库连接池


    数据库连接池类别

    目前市面上常用的就2个,其他的不必看

    • HikariCP (Spring默认内置)
    • druid

    HikariCP是Spring中默认的数据库连接池方案,国外用的多,国内一般用的是 druid。

    druid 和 druid-spring-boot-starter区别

    • druid-spring-boot-starter 是在 druid 基础上进行了一次封装,专门用来整合 spring-boot 项目;
    • druid 需要自己手动编写配置类并注入到 bean 中
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.2.8</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.8</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结论:使用 druid-spring-boot-starter

    使用 druid-spring-boot-starter

    一共有3步

    1. pom中导入坐标,3个坐标
    2. application.yml文件中写入配置信息,注意格式
    3. 编写一个测试类验证

    注意不用再编写配置类


    1. pom中导入坐标,3个坐标
    
    <!--   数据库连接   -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.8</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. application.yml文件中写入配置信息

    注意配置url、username、password、driver以外的其他配置必须在druid下写,这样会自动包装到DruidDataSourceWrapper里面

    server:
      port: 9110
    
    spring:
      application:
        name: reggie
      datasource:
        # JDBC配置:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/firstdemo?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
        username: root
        password: 123456
    
        # 连接池配置:
        druid:
          initial-size: 10   # 初始化大小
          min-idle: 5     # 最小空闲连接个数
          max-active: 20    # 最大连接个数
          max-wait: 60000   # 配置获取连接等待超时的时间
          pool-prepared-statements: true  # 打开PSCache,并且指定每个连接上PSCache的大小
          max-pool-prepared-statement-per-connection-size: 20
          time-between-eviction-runs-millis: 60000    # 配置间隔多久才进行一次监测,监测需要关闭的空闲连接,单位时毫秒
          min-evictable-idle-time-millis: 60000       # 配置一个连接在池中最小生存的时间
    
          #validation-query: SELECT 1 FROM DUAL
          test-while-idle: true            # 建议配置为true,不影响性能,并且保证安全性。如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
          test-on-borrow: false            # 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
          test-on-return: false            # 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    
          # 启用Druid内置的Filter,会使用默认的配置。可自定义配置,见下方的各个filter节点。
          filters: stat,wall
    
          # StatViewServlet监控器。开启后,访问http://域名/druid/index.html
          stat-view-servlet:
            enabled: true # 开启 StatViewServlet,即开启监控功能
            login-username: daniel # 访问监控页面时登录的账号
            login-password: 1234 # 密码
            url-pattern: /druid/* # Servlet的映射地址,不填写默认为"/druid/*"。如填写其它地址,访问监控页面时,要使用相应的地址
            reset-enable: false # 是否允许重置数据(在页面的重置按钮)。(停用后,依然会有重置按钮,但重置后不会真的重置数据)
            allow: 127.0.0.1,192.168.2.29,192.168.1.1 # 监控页面访问白名单。默认为127.0.0.1。与黑名单一样,支持子网掩码,如128.242.127.1/24。多个ip用英文逗号分隔
            deny: 22.1.2.3 # 监控页面访问黑名单
    
          # 配置 WebStatFilter(StatFilter监控器中的Web模板)
          web-stat-filter:
            enabled: true # 开启 WebStatFilter,即开启监控功能中的 Web 监控功能
            url-pattern: /* # 映射地址,即统计指定地址的web请求
            exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*' # 不统计的web请求,如下是不统计静态资源及druid监控页面本身的请求
            session-stat-enable: true # 是否启用session统计
            session-stat-max-count: 1 # session统计的最大个数,默认是1000。当统计超过这个数,只统计最新的
            principal-session-name: userName # 所存用户信息的serssion参数名。Druid会依照此参数名读取相应session对应的用户名记录下来(在监控页面可看到)。如果指定参数不是基础数据类型,将会自动调用相应参数对象的toString方法来取值
            principal-cookie-name: userName # 与上类似,但这是通过Cookie名取到用户信息
            profile-enable: true # 监控单个url调用的sql列表(试了没生效,以后需要用再研究)
    
    
          filter:
            stat:
              log-slow-sql: false
              slow-sql-millis: 1000
              merge-sql: false
            wall:
              config:
                multi-statement-allow: true
    
    • 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
    1. 编写一个测试类验证
    package com.cool.reggie;
    
    
    import com.alibaba.druid.pool.DruidDataSource;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.jdbc.core.JdbcTemplate;
    
    import javax.annotation.Resource;
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    import java.util.List;
    import java.util.Map;
    
    
    /**
     * @Author ifredomvip@gmail.com
     * @Date 2022/6/30 9:46
     * @Version 1.0.0
     * @Description
     **/
    @SpringBootTest
    public class DruidStarterTest {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        @Resource
        private DataSource dataSource;
    
    
        @Test
        public void testDruidConnector() throws SQLException, InstantiationException, IllegalAccessException {
            DruidDataSource druidDataSource = (DruidDataSource) dataSource;
            System.out.println(druidDataSource.getUsername());
            System.out.println(druidDataSource.getPassword());
            System.out.println(dataSource.getClass());
    
            Connection connection = dataSource.getConnection();
            System.out.println(connection);
            connection.close();
    
            List<Map<String, Object>> maps = jdbcTemplate.queryForList("select * from student");
            for (Map<String, Object> map : maps) {
                System.out.println(map);
            }
    
        }
    
    }
    
    • 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

    druid监控

    druid 不光是数据库连接池,还可以查看数据源,sql监控、sql防火墙、web应用、session监控、URI监控、spring监控、json api等信息。

    可以实时观察数据库连接池和 SQL 的运行情况,帮助我们及时排查出系统中存在的问题。

    访问地址:http://localhost:9110/druid/index.html

    如果你复制了上面的配置内容,那么stat-view-servlet.allow 白名单需要改为你自己的本地Ip地址,或者不设置此项。
    否则你会看到页面Sorry, you are not permitted to view this page.
    tips: 查看自己本机的ip地址,命令行中输入 ipconfig,

    参考资料

    Maven仓库 - druid
    配置StatFilter
    druid-start自动装配原理

  • 相关阅读:
    实例分割Yolact边缘端部署 (三) 从onnx到caffemodel
    Redis源码(1) 建立监听服务和开启事件循环
    CentOS安装kafka单机部署
    神经网络解决优化问题,神经网络 样本不平衡
    Python面试宝典:Python中与常用的机器学习库相关的面试笔试题(1000加面试笔试题助你轻松捕获大厂Offer)
    【SpringBoot+Vue实现书籍管理系统--下篇】整合MyBatisPlus完成分页功能的开发并部署到docker容器中
    IPV6地址
    (附源码)spring boot企业网站设计与实现 毕业设计 211750
    2023中国中医药展|中医理疗展|山东中医医疗器械展览会
    Unity2021发布微信小游戏步骤(附带工具和源码)
  • 原文地址:https://blog.csdn.net/win7583362/article/details/125539051