ibcadmin 发表于 2019-10-17 09:48:05

SpringBoot整合Druid

<p>迩来不停在折腾springboot,也根据需要整合了一些好用的库,mybatis作为连续层数据操作,也想用一下大名鼎鼎的Druid来做毗连池和数据库监控服务。于是探索了一下战书,整理出这篇小文,盼望能帮助到同道,也给本身做个记载反思。</p>
<ul>
<li>1.关于Druid</li>
</ul>
<p><strong>Druid</strong>是阿里团队开源的高性能数据库毗连池,国内利用广泛,特别是在监控sql和数据库性能方面非常强大。</p>
<p>毗连池能有效节流数据库毗连消耗,且对高写入、实时性要求高的业务非常符合。</p>
<ul>
<li>2.引入依赖到pom.xml中。</li>
</ul>
<code><dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.10</version>
</dependency>
</code>
<ul>
<li>3.然后在application.yml中设置相干设置</li>
</ul>
<code>spring:
datasource:
    url: jdbc:mysql://127.0.0.1:3306/test_go?characterEncoding=UTF-8&useSSL=false
    username: xxx
    password: xxxxxx
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 5
      min-idle: 5
      max-active: 20
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 20
      max-wait: 60000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 30000
      filters: stat
      async-init: true</code>
<p>此中最重要的是</p>
<blockquote>
<p>type: com.alibaba.druid.pool.DruidDataSource</p>
</blockquote>
<p>如许就不会利用Springboot默认的毗连池Hikari。</p>
<p>由于SpringBoot没法见效写在yml文件中的设置,需要单独编写Bean文件来加载。</p>
<ul>
<li>4.定义Druid设置类。</li>
</ul>
<code>package com.tony.testspringboot.config;


import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;
import java.sql.SQLException;

@Configuration
public class DruidConfig {
    private Logger logger = LoggerFactory.getLogger(DruidConfig.class);

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;
    @Value("${spring.datasource.test-druid.driver-class-name}")
    private String driverClassName;

    @Value("${spring.datasource.druid.initial-size}")
    private int initialSize;

    @Value("${spring.datasource.druid.min-idle}")
    private int minIdle;

    @Value("${spring.datasource.druid.max-active}")
    private int maxActive;

    @Value("${spring.datasource.druid.max-wait}")
    private int maxWait;

    @Value("${spring.datasource.druid.time-between-eviction-runs-millis}")
    private int timeBetweenEvictionRunsMillis;

    @Value("${spring.datasource.druid.min-evictable-idle-time-millis}")
    private int minEvictableIdleTimeMillis;

    @Value("${spring.datasource.druid.test-while-idle}")
    private boolean testWhileIdle;

    @Value("${spring.datasource.druid.test-on-borrow}")
    private boolean testOnBorrow;

    @Value("${spring.datasource.druid.test-on-return}")
    private boolean testOnReturn;

    @Value("${spring.datasource.druid.pool-prepared-statements}")
    private boolean poolPreparedStatements;

    @Value("${spring.datasource.druid.max-pool-prepared-statement-per-connection-size}")
    private int maxPoolPreparedStatementPerConnectionSize;

    @Value("${spring.datasource.druid.filters}")
    private String filters;

    @Bean
    @Primary
    public DataSource dataSource() {
      DruidDataSource datasource = new DruidDataSource();

      datasource.setUrl(this.dbUrl);
      datasource.setUsername(this.username);
      datasource.setPassword(this.password);
      datasource.setDriverClassName(this.driverClassName);

      // configuration
      datasource.setInitialSize(this.initialSize);
      datasource.setMinIdle(this.minIdle);
      datasource.setMaxActive(this.maxActive);
      datasource.setMaxWait(this.maxWait);
      datasource.setTimeBetweenEvictionRunsMillis(this.timeBetweenEvictionRunsMillis);
      datasource.setMinEvictableIdleTimeMillis(this.minEvictableIdleTimeMillis);
      datasource.setTestWhileIdle(this.testWhileIdle);
      datasource.setTestOnBorrow(this.testOnBorrow);
      datasource.setTestOnReturn(this.testOnReturn);
      datasource.setPoolPreparedStatements(this.poolPreparedStatements);
      datasource.setMaxPoolPreparedStatementPerConnectionSize(this.maxPoolPreparedStatementPerConnectionSize);

      try {
            datasource.setFilters(this.filters);
      } catch (SQLException e) {
            logger.error("druid configuration init fail!");
      }

      return datasource;
    }
}
</code>
<p>云云即可让设置的参数见效并作为首选的DataSource进利用用。</p>
<p>5.在Controller中测试。</p>
<p>可以利用JdbcTemplate来进行查询。<br />
测试代码如下所示:</p>
<code>@RequestMapping(value = "/hey", method = RequestMethod.GET)
public ResultResponse testDruid() {

    String sql = "SELECT mobile FROM user WHERE id = ?";

    String mobile = jdbcTemplate.queryForObject(sql, new Object[]{1}, String.class);

    return new ResultResponse(201, "hey" + mobile);
}
</code>
<p><strong>PS:</strong> ResultResponse是我项目中封装的通用response对象。</p>
<p>关于多数据源参数的设置。</p>
<p>只需要在yml(application.yml)中设置即可,格式如下:</p>
<code>datasource:
    one-source:
      url: jdbc:mysql://127.0.0.1:3306/test_go?characterEncoding=UTF-8&useSSL=false
      username: xxxx1
      password: xxxx
      driver-class-name: com.mysql.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
    two-source:
      url: jdbc:mysql://127.0.0.1:3306/demo2?characterEncoding=UTF-8&useSSL=false
      username: xxxx
      password: 1xxxxxx
      driver-class-name: com.mysql.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
    ...</code>
<p>利用的时候也遵照这个结构,如要获取第一个数据源的url设置则在DruidConfig.java文件中的相应项的@Value中如许写:</p>
<code>@Value("${spring.datasource.one-source.url}")
private String dbUrl;</code>
<ul>
<li>6.设置数据库监控。</li>
</ul>
<p>a) 先在application.yml中增加如下设置:</p>
<code>druid:
   .....
   # 通过connectProperties属性来打开mergeSql功能;慢SQL记载
   connection-properties: druid.stat.mergeSql=true;druid.stat.SlowSqlMills=5000
   # 监控后台的设置,如登录账号和暗码等
   monitor:
   allow: 127.0.0.1
   loginUsername: admin
   loginPassword: admin</code>
<p>b)单独编写DruidMonitorConfiguration类。</p>
<code>public class DruidMonitorConfiguration {

    @Value("${spring.datasource.druid.monitor.allow}")
    private String allow;
//    @Value("${spring.datasource.druid.monitor.deny}")
//    private String deny;
    @Value("${spring.datasource.druid.monitor.loginUsername}")
    private String loginUsername;
    @Value("${spring.datasource.druid.monitor.loginPassword}")
    private String loginPassword;
    @Value("${spring.datasource.druid.monitor.resetEnable")
    private String resetEnable;
    @Bean
    public ServletRegistrationBean druidStatViewServlet() {
      ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
      servletRegistrationBean.addInitParameter("allow", this.allow);
//      servletRegistrationBean.addInitParameter("deny", this.deny);
      servletRegistrationBean.addInitParameter("loginUsername", this.loginUsername);
      servletRegistrationBean.addInitParameter("loginPassword", this.loginPassword);
      servletRegistrationBean.addInitParameter("resetEnable", this.resetEnable);
      return servletRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean druidStatFilter() {
      FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
      filterRegistrationBean.addUrlPatterns("/*");
      filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
      return filterRegistrationBean;
    }

}
</code>
<p>访问方法就是:http://project-name.com/druid/login.html</p>
<p>验证登录即可。整个监控功能非常强大,有sql监控、URI监控、Session监控,Web应用等等。</p><br><br/><br/><br/><br/><br/>来源:<a href="https://www.cnblogs.com/freephp/p/11688387.html" target="_blank">https://www.cnblogs.com/freephp/p/11688387.html</a>
页: [1]
查看完整版本: SpringBoot整合Druid