SpringBoot整合Druid

Posted 梁云亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot整合Druid相关的知识,希望对你有一定的参考价值。

Druid简介

Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。
优点:

  • 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
  • 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
  • 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
  • SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,开发者可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。
  • 扩展JDBC,如果要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件

SpringBoot集成Druid

第一步:创建项目,添加依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </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.1.22</version>
    </dependency>
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-jdbc</artifactId>
   </dependency>

注:如果没有引入spring-boot-starter-jdbc,会报错:java.lang.ClassNotFoundException: org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType

第二步:配置文件

server:
  port: 80
  servlet:
    context-path: /imbp

spring:
  #配置数据源
  datasource:
    druid:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/db_test?useSSL=false&serverTimezone=GMT%2B8
        username: root
        password: root
        type: com.alibaba.druid.pool.DruidDataSource
        # 连接池的配置信息:初始化大小,最小,最大
        initial-size: 8
        min-idle: 1
        max-active: 20
        # 配置获取连接等待超时的时间
        max-wait: 60000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        time-between-eviction-runs-millis: 60000
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        min-evictable-idle-time-millis: 300000
        #验证库是否正常sql
        validation-query: select x from dual
        #空闲时验证,防止连接断开
        test-while-idle: true
        test-on-borrow: false
        test-on-return: false
        # 打开PSCache,并且指定每个连接上PSCache的大小
        pool-prepared-statements: true
        max-open-prepared-statements: 20
        max-pool-prepared-statement-per-connection-size: 20
        # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,wall用于防火墙
        filters: stat,wall,slf4j
        # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
        connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
        # 合并多个DruidDataSource的监控数据
        use-global-data-source-stat: true

第三步:编写 druid 监控类

@Configuration
public class DruidConfiguration 

    @ConfigurationProperties(prefix = "spring.datasource.druid")
    @Bean
    public DataSource druid()
        return new DruidDataSource();
    

    /**
     * druid 数据源状态监控
     * @return
     */
    @Bean
    public ServletRegistrationBean statViewServlet()
        //创建servlet注册实体
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
        //设置ip白名单
        servletRegistrationBean.addInitParameter("allow","127.0.0.1");
        //设置ip黑名单,如果allow与deny共同存在时,deny优先于allow
        servletRegistrationBean.addInitParameter("deny","192.168.0.19");
        //设置控制台管理用户
        servletRegistrationBean.addInitParameter("loginUsername","druid");
        servletRegistrationBean.addInitParameter("loginPassword","1234");
        //是否可以重置数据
        servletRegistrationBean.addInitParameter("resetEnable","false");
        return servletRegistrationBean;
    

    /**
     * druid 过滤器
     * @return
     */
    @Bean
    public FilterRegistrationBean statFilter()
        //创建过滤器
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
        //设置过滤器过滤路径
        filterRegistrationBean.addUrlPatterns("/*");
        //忽略过滤的形式
        filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    

测试

验证系统使用的是Druid

按如下所示供测试代码,将断点设置到编号①所在的行,然后Debug高度可以看到dataSource接口的实现类就是durid的实现类,可以继续找到配置文件中的一些初始化参数

@RunWith(SpringRunner.class)
@SpringBootTest
class IntegratemyMyBatisPlusApplicationTests 

    @Autowired
    DataSource dataSource;

    @Test
    public void contextLoads() throws SQLException 
        Connection connection = dataSource.getConnection();
        PreparedStatement prepareStatement = connection.prepareStatement("select * from tb_emp where deptno=20"); //----- ①
        ResultSet resultSet = prepareStatement.executeQuery();
        while (resultSet.next()) 
            String cityName = resultSet.getString("ename");
            System.out.println(cityName);
        
    

结果:

查看Druid监控

网址:http://localhost:80/imbp/druid/index.html ,其中:

  • localhost:指项目IP地址
  • 80:指项目端口号
  • imbp:指项目部署时的名称

结果:

监控中心说明如下:

名称 作用
数据源 可以看到项目中管理的所有数据源配置的详细情况,除了密码没有显示外其他都在
SQL监控 可以查看所有的执行sql语句
SQL防火墙 druid提供了黑白名单的访问,可以清楚的看到sql防护情况
Web应用 可以看到目前运行的web程序的详细信息
URI监控 可以监控到所有的请求路径的请求次数、请求时间等其他参数
Session监控 可以看到当前的session状况,创建时间、最后活跃时间、请求次数、请求时间等详细参数
JSONAPI 通过api的形式访问Druid的监控接口,api接口返回Json形式数据

以上是关于SpringBoot整合Druid的主要内容,如果未能解决你的问题,请参考以下文章

springboot---整合druid连接池---连接oracle数据库---整合mybatis---整合thymeleaf---日志配置

SpringBoot 整合Druid

SpringBoot整合Druid数据源

SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源配置 MyBatis事务控制druid 监控)

SpringBoot | DruidSpringBoot整合Druid

SpringBoot 整合--Druid