SpringBoot整合druid多數據源監(jiān)控

1. maven引入配置

        <!--druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.16</version>
        </dependency>

2. 配置數據源,SpringBoot 的配置文件

這里使用的是MySql+kylin兩種數據源

spring:
  datasource-kylin:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: org.apache.kylin.jdbc.Driver
    url: jdbc:kylin://ip:7013/Pro01
    username: ADMIN
    password: ob98hyK9g/uvM/rIhpMT+WBLT7kdfOHfZC7slJcXPHcTxSTE//19/mbeJCsboK1Nn3Eub/xzdv+J8JHbWA+8SQ==
    validationQuery: select 'x'
    filters: default
    publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKK4LArN8Vx3wUuYS5tw6+YPmj/acdi9djlrTBE+1Nc32siEAr6BPb+PxkpGoI82MhyJeQK26yIh5B5MdIXNKcMCAwEAAQ==
    connectionProperties: timeZone=GMT +08;druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=${spring.datasource-kylin.publicKey}
  datasource-mysql:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.202.162:3306/jcpt?useUnicode=true&characterEncoding=utf8
    username: root
    password: Fg8rH4UnByjNQ4d+kz+L3PSfBV4GoDlrINWIc9w6chBqwhdQnfJjvL83f1FwqhcwC8JI6/op46lp1BzWpoYcXQ==
    initialSize: 20
    minIdle: 3
    maxActive: 200
    # 配置獲取連接等待超時的時間
    maxWait: 60000
    # 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
    timeBetweenEvictionRunsMillis: 60000
    # 配置一個連接在池中最小生存的時間,單位是毫秒
    minEvictableIdleTimeMillis: 30000
    validationQuery: select 'x'
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    # 打開PSCache,并且指定每個連接上PSCache的大小
    poolPreparedStatements: true
    maxPoolPreparedStatementPerConnectionSize: 20
    # 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'wall'用于防火墻
    filters: config,stat,wall,slf4j
    # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
    publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALsHTtzfPi8BdWb2ZYol4gxdsAoeeMlGHIT7lttLijCdeBCFgjr/yS6clTCFOsb5syw+qcOLDD7EFHpDhzlOiPkCAwEAAQ==
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=${spring.datasource-mysql.publicKey}
    # 合并多個DruidDataSource的監(jiān)控數據
    useGlobalDataSourceStat: true

3. 配置對應數據源的bean

Mysql:

@Configuration
@MapperScan(basePackages = {"com.base.web.aisino.dao","com.base.web.common.dao","com.base.web.system.dao","com.base.web.test.dao"} , sqlSessionFactoryRef = "mysqlSessionFactory")
public class MysqlConfig {

    /**
     *  精確到 master 目錄,以便跟其他數據源隔離
     */
    private static final String MAPPER_LOCATION = "classpath:mybatis/*/*.xml";

    @Value("${other.loginPassword}")
    private String loginPassword;

    @Autowired
    @Qualifier("mysqlDataSource")
    private DataSource mysqlDataSource;

    @Bean(name = "mysqlTransactionManager")
    @Primary
    public DataSourceTransactionManager mysqlTransactionManager() {
        return new DataSourceTransactionManager(mysqlDataSource);
    }

    @Bean(name = "mysqlSessionFactory")
    @Primary
    public SqlSessionFactory mysqlSessionFactory(@Qualifier("mysqlDataSource") DataSource mysqlDataSource)
            throws Exception {

        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(mysqlDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(MysqlConfig.MAPPER_LOCATION));
        //添加駝峰命名法 映射
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        sessionFactory.setConfiguration(configuration);
        return sessionFactory.getObject();
    }
}

Kylin:

@Configuration
@MapperScan(basePackages = {"com.base.web.kylin.*.dao","com.base.web.openapi.*.dao"},sqlSessionFactoryRef = "kylinSessionFactory")
public class KylinConfig {
    private static final String MAPPER_LOCATION = "classpath:kylinmybatis/*/*.xml";

    @Autowired
    @Qualifier("kylinDataSource")
    private DataSource kylinDataSource;

    @Bean(name = "kylinTransactionManager")
    public DataSourceTransactionManager kylinTransactionManager() {
        return new DataSourceTransactionManager(kylinDataSource);
    }

    @Bean(name = "kylinSessionFactory")
    public SqlSessionFactory kylinSessionFactory(@Qualifier("kylinDataSource") DataSource kylinDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(kylinDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(KylinConfig.MAPPER_LOCATION));
        //添加駝峰命名法 映射
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        sessionFactory.setConfiguration(configuration);
        return sessionFactory.getObject();
    }
}

4. 配置druid頁面相關信息

    @Bean
    @Primary
    public ServletRegistrationBean druidServlet() {
        ServletRegistrationBean reg = new ServletRegistrationBean();
        reg.setServlet(new StatViewServlet());
        reg.addUrlMappings("/druid/*");
        //白名單
        Map<String,String> initParameters = new HashMap<>(16);
        //禁用HTML頁面上的“REST ALL”功能
        initParameters.put("resetEnable","false");
        //IP白名單(沒有配置或者為空,則允許所有訪問)
        initParameters.put("/druid/*","");
        //監(jiān)控頁面登錄用戶名
        initParameters.put("loginUsername","admin");
        //監(jiān)控頁面登錄用戶密碼
        initParameters.put("loginPassword", loginPassword);
        //ip黑名單
        initParameters.put("deny","");
        reg.setInitParameters(initParameters);
        return reg;
    }


    @Bean
    @Primary
    public FilterRegistrationBean filterRegistrationBean() {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        filterRegistrationBean.addInitParameter("profileEnable", "true");
        filterRegistrationBean.addInitParameter("principalCookieName","USER_COOKIE");
        filterRegistrationBean.addInitParameter("principalSessionName","USER_SESSION");
        filterRegistrationBean.addInitParameter("DruidWebStatFilter","/*");
        return filterRegistrationBean;
    }

5. 訪問頁面查看

ip:port/druid


ps:若使用druid監(jiān)控頁面,必須在springboot配置文件中配置filters的stat

ps2:使用druid監(jiān)控頁面監(jiān)控kylin時,使用密文密碼可能會導致無法監(jiān)控sql的情況,可以使用明文密碼驗證

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容