美文网首页开发技术积累
springboot druid监控

springboot druid监控

作者: 会去大草原的程序猿 | 来源:发表于2019-12-16 13:26 被阅读0次

    Druid它好在哪:

    它可以提供数据源、sql防火墙,web应用,URI监控、Session监控,spring监控等。
    方便进行针对性改造和优化,提高项目性能。

    如下是实现的具体操作:

    一、引入依赖

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

    二、配置文件(spring.datasource 下的配置)

        #配置druid监控参数
        type: com.alibaba.druid.pool.DruidDataSource
        initialSize: 5
        minIdle: 5
        maxActive: 20
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        filters: stat,wall,log4j
    

    三、三个关键类(没有试是否可以省略)

    (1)DruidConfig

    import java.sql.SQLException;
    import javax.sql.DataSource;
    import org.apache.log4j.Logger;
    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 com.alibaba.druid.pool.DruidDataSource;
    
    @Configuration
    public class DruidConfig {
     private Logger logger = Logger.getLogger(this.getClass());
    
     @Value("${spring.datasource.url}")
     private String dbUrl;
    
     @Value("${spring.datasource.username}")
     private String username;
    
     @Value("${spring.datasource.password}")
     private String password;
    
     @Value("${spring.datasource.driver-class-name}")
     private String driverClassName;
    
     @Value("${spring.datasource.initialSize}")
     private int initialSize;
    
     @Value("${spring.datasource.minIdle}")
     private int minIdle;
    
     @Value("${spring.datasource.maxActive}")
     private int maxActive;
    
     @Value("${spring.datasource.maxWait}")
     private int maxWait;
    
     @Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
     private int timeBetweenEvictionRunsMillis;
    
     @Value("${spring.datasource.minEvictableIdleTimeMillis}")
     private int minEvictableIdleTimeMillis;
    
     @Value("${spring.datasource.validationQuery}")
     private String validationQuery;
    
     @Value("${spring.datasource.testWhileIdle}")
     private boolean testWhileIdle;
    
     @Value("${spring.datasource.testOnBorrow}")
     private boolean testOnBorrow;
    
     @Value("${spring.datasource.testOnReturn}")
     private boolean testOnReturn;
    
     @Value("${spring.datasource.poolPreparedStatements}")
     private boolean poolPreparedStatements;
    
     @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
     private int maxPoolPreparedStatementPerConnectionSize;
    
     @Value("${spring.datasource.filters}")
     private String filters;
    
     @Value("{spring.datasource.connectionProperties}")
     private String connectionProperties;
    
     @Bean
     @Primary //主数据源
     public DataSource dataSource(){
      DruidDataSource datasource = new DruidDataSource();
      datasource.setUrl(this.dbUrl);
      datasource.setUsername(username);
      datasource.setPassword(password);
      datasource.setDriverClassName(driverClassName);
      //configuration
      datasource.setInitialSize(initialSize);
      datasource.setMinIdle(minIdle);
      datasource.setMaxActive(maxActive);
      datasource.setMaxWait(maxWait);
      datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
      datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
      datasource.setValidationQuery(validationQuery);
      datasource.setTestWhileIdle(testWhileIdle);
      datasource.setTestOnBorrow(testOnBorrow);
      datasource.setTestOnReturn(testOnReturn);
      datasource.setPoolPreparedStatements(poolPreparedStatements);
      datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
      try {
       datasource.setFilters(filters);
      } catch (SQLException e) {
       logger.error("druid configuration Exception", e);
      }
      datasource.setConnectionProperties(connectionProperties);
      return datasource;
     }
    }
    

    (2)DruidFilter

    import javax.servlet.annotation.WebFilter;
    import javax.servlet.annotation.WebInitParam;
    import com.alibaba.druid.support.http.WebStatFilter;
    
    @WebFilter(filterName="druidWebStatFilter",urlPatterns="/*",
      initParams={
        @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略资源
      }
    )
    public class DruidFilter extends WebStatFilter {
    }
    

    (3)DruidServlet

    import javax.servlet.annotation.WebInitParam;
    import javax.servlet.annotation.WebServlet;
    import com.alibaba.druid.support.http.StatViewServlet;
    
    @WebServlet(urlPatterns="/druid/*",
      initParams={
        @WebInitParam(name="allow",value=""),// IP白名单(没有配置或者为空,则允许所有访问)
        @WebInitParam(name="deny",value=""),// IP黑名单 (deny优先于allow)
        @WebInitParam(name="loginUsername",value="admin"),// 登录druid管理页面用户名
        @WebInitParam(name="loginPassword",value="admin")// 登录druid管理页面密码
      })
    public class DruidServlet extends StatViewServlet {
    
    }
    
    四、最后别忘了在启动类上加入注解@ServletComponentScan,让项目扫描到servlet。(一般都会加过了)
    五、看看效果

    访问页面http://127.0.0.1:8080/{projectName}/druid/index.html就可以访问监控页面了,druid已经将数据友好的显示到页面上了,包括每条sql执行的次数,执行的时间,最慢时间等等很多详细信息,供我们参考,找到哪些执行效率低的耗时长的语句进行优化。同时提供数据源、sql防火墙,web应用,URI监控、Session监控,spring监控等。
    如图:可以看到第一个sql执行的慢并且被调用的次数多,

    可以针对地优化一下了。

    image.png

    相关文章

      网友评论

        本文标题:springboot druid监控

        本文链接:https://www.haomeiwen.com/subject/zmarnctx.html