springboot 多数据源配置driud 监控配置和遇到的坑

454 阅读2分钟

首先听上去这个活很简单不就是配置吗 so easy,不! 不! 不!这里面很多坑 动态数据源的配置和依赖见上文 传送门 driud配置先添加依赖

 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <version>1.1.10</version>
 </dependency>

yml的配置

 spring:
 datasource:
   dynamic:
     datasource:
       master:
         driver-class-name: com.mysql.cj.jdbc.Driver
         druid:
           filters: stat,wall,log4j2
           initial-size: 5
           max-active: 20
           max-evictable-idle-time-millis: 300000
           max-wait: 60000
           min-evictable-idle-time-millis: 300000
           min-idle: 5
           pool-prepared-statements: true
           share-prepared-statements: true
           test-on-borrow: false
           test-on-return: false
           test-while-idle: true
           time-between-eviction-runs-millis: 60000
           validation-query: select 1
           validation-query-timeout: -1
           loginUsername: root
           loginPassword: 123456
           exclusions: '*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*'
           url-pattern: /*
         password: password
         type: com.alibaba.druid.pool.DruidDataSource
         url: jdbc:mysql://xxx.xxx.xx:3306/black_cat_fish?useSSL=false&useUnicode=true&characterEncoding=UTF-8
         username: root
     primary: master

数据库驱动要是选择com.p6spy.engine.spy.P6SpyDriver 就要将 filters: stat,wall,log4j2更改为 filters: stat,log4j2 因为用p6spy做了代理不然启动会报以下错误:

java.lang.IllegalStateException: dbType not support : null, url null
    at com.alibaba.druid.wall.WallFilter.init(WallFilter.java:159) ~[druid-1.1.5.jar:1.1.5]
    at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:770) [druid-1.1.5.jar:1.1.5]
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1215) [druid-1.1.5.jar:1.1.5]
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1211) [druid-1.1.5.jar:1.1.5]
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:105) [druid-1.1.5.jar:1.1.5]
    at 

配置类

package com.gafc.comm.config;

import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

/**
 * druid监控界面设置
 */
@Configuration
@Profile({"dev", "sit", "uat"})
@Slf4j
public class DruidConfiguration {
    @Bean
    public ServletRegistrationBean druidStatViewServle() {
        //注册服务
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(
                new StatViewServlet(), "/druid/*");
        // 白名单(为空表示,所有的都可以访问,多个IP的时候用逗号隔开)
        servletRegistrationBean.addInitParameter("allow", " ");
        // IP黑名单 (存在共同时,deny优先于allow) (黑白名单就是如果是黑名单,那么该ip无法登陆该可视化界面)
//        servletRegistrationBean.addInitParameter("deny", "127.0.0.2");
        // 设置登录的用户名和密码
        servletRegistrationBean.addInitParameter("loginUsername", "root");
        servletRegistrationBean.addInitParameter("loginPassword", "123456");
        // 是否能够重置数据.
        servletRegistrationBean.addInitParameter("resetEnable", "false");
        return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean druidStatFilter() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(
                new WebStatFilter());
        // 添加过滤规则
        filterRegistrationBean.addUrlPatterns("/*");
        // 添加不需要忽略的格式信息
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        log.info("druid初始化成功!");
        return filterRegistrationBean;

    }
}

一般情况启动项目然后访问localhost:8088/druid/index.html就会出现一下界面

image.png 对到此没有什么问题 如果执行一个接口或者是执行sql问题就来了 LocalDateTime 字段报错: Error attempting to get column ‘reg_time‘ from result set 没错我使用了mybatis-plus(3.3.4) 此时不兼容 driud 版本 一开始我没有直接取官网去看,直接取百度,消耗了大量时间也没有解决,原因就是依赖版本不兼容 后来我找到官网 然后找到了解决方案,在此想说一下,有问题还是先找官网,靠谱!官网解释如下

image.png 果断把mp降到3.3.0 把driud 升级到1.2.23版本

<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <version>1.1.23</version>
 </dependency>

到此这个问题解决 在配置过程中不止遇到这一个问题,当时没有记录了,最终都解决了,以后补录把 最后再将spring 监控配置一下

package com.gafc.comm.config;

import com.alibaba.druid.support.spring.stat.DruidStatInterceptor;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.JdkRegexpMethodPointcut;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * 委托Druid进行Spring 监控
 */
@Configuration
public class SpringMonitoringConfig {

    @Bean(name = "druid-stat-interceptor")
    public DruidStatInterceptor druidStatInterceptor() {
        return new DruidStatInterceptor();
    }

    @Bean(name = "druid-stat-pointcut")
    // 非单例
    @Scope("prototype")
    public JdkRegexpMethodPointcut druidStatPointcut() {
        final JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
        // 这里是你Controller包的路径
        pointcut.setPatterns("com.xxx.controller.*"
        );
        return pointcut;
    }

    @Bean
    public DefaultPointcutAdvisor druidStatAdvisor(@Qualifier("druid-stat-interceptor") final DruidStatInterceptor druidStatInterceptor,
                                                   @Qualifier("druid-stat-pointcut") final JdkRegexpMethodPointcut druidStatPointcut) {
        final DefaultPointcutAdvisor defaultPointAdvisor = new DefaultPointcutAdvisor();
        defaultPointAdvisor.setPointcut(druidStatPointcut);
        defaultPointAdvisor.setAdvice(druidStatInterceptor);
        return defaultPointAdvisor;
    }

}