SpringBoot集成Druid数据源并监控程序与数据库资源交互情况

在这里插入图片描述
Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能。(Druid可以帮我们时时监控程序与数据库的交互情况)
SpringBoot集成Druid使用步骤:

1. 新建一个Springboot项目后(或者在现有的springboot项目中),在pom.xml中导入Druid依赖的jar包
    <!-- druid数据库依赖包 -->		
    <!--导jar包网站:  https://mvnrepository.com/-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.1.9</version>
    </dependency>
2. 在application.properties配置文件中添加springData配置属性
#配置内置tomcat端口号(配置项目端口号,此处可忽略)
server.port=8082

#数据库配置(若已经配置了,此处可忽略)
spring.jpa.database=mysql
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.100.75:3306/octopus?useUnicode=true&characterEncoding=utf-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&allowMultiQueries=true
spring.datasource.username=666
spring.datasource.password=mmm

#mybatis 配置(若已经指定mapper映射文件位置了,此处配置可忽略)
#扫描映射文件:指定resource下mapper映射文件位置
mybatis.mapper-locations=classpath:mapper/*/*Mapper.xml
#可在mybatis-config.xml文件中配置STDOUT_LOGGING,请求时可在控制台打印出sql语句
mybatis.config-location=classpath:mybatis-config.xml


# 连接池的配置信息(以下配置选项是此处重点)
# 初始化大小,最小,最大
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20

# 配置当前要使用的数据源的操作类型
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource

# 配置获取连接等待超时的时间
spring.datasource.maxWait=60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.timeBetweenEvictionRunsMillis=60000  
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.exceptionSorter=true
spring.datasource.testOnReturn=false
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.poolPreparedStatements=true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
spring.datasource.useGlobalDataSourceStat=true
3. 和application启动类同级下创建一个config包,用来读取上面设置的springData数据源配置项
package com.hokai.config;

import java.sql.SQLException;
import javax.sql.DataSource;
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 //声明此类是个配置类,相当于之前的xml配置文件
@Primary  
/* @Primary :表示这里定义的DataSource将覆盖其他来源的DataSource(在同样的DataSource中,首先使用被标注的DataSource);
此注解最好用在类上,也可以用在方法上,因为此注解用在方法上仍有可能被其他的DataSource覆盖此处的DataSource */
public class DruidConfiguration {

    @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.filters}")      
    private String filters; 

    @Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")     
    private int maxPoolPreparedStatementPerConnectionSize;

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

    @Value("${spring.datasource.useGlobalDataSourceStat}")      
    private boolean useGlobalDataSourceStat;  

    /**
     * @Bean 声明,DataSource 对象为 Spring 容器所管理;
     * @Primary 表示这里定义的DataSource将覆盖其他来源的DataSource。
     * StatFilter,用于统计监控信息。StatFilter的别名是stat。
     * 统计SQL信息,合并统计。mergeStat是的MergeStatFilter缩写。
     *     通过 DataSource 的属性<property name="filters" value="mergeStat" /> 或者
     *  connectProperties属性来打开mergeSql功能 <property name="connectionProperties" value="druid.stat.mergeSql=true" />
     * StatFilter属性slowSqlMillis用来配置SQL慢的标准
     *
     * @return
     */
  @Bean   // DataSource对象被@Bean声明,交给Spring容器来进行管理
  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);          
         datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);          
        try {   
            /**
             * 设置StatFilter,用于统计监控信息。
             * StatFilter的别名是stat
             */
            datasource.setFilters(filters);         
            } catch (SQLException e) {              
                System.err.println("druid configuration initialization filter: "+ e);          
            }          
        datasource.setConnectionProperties(connectionProperties);  

        return datasource;
    }

}
3. 配置监控统计功能 (在上面创建的config包下新建一个配置类,此处有两种写法,两种写法任选其一:1.用@bean注解 2.用其他注解)
第一种方式:
    package com.hokai.config;

    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 com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    @Configuration
    public class DruidMonitorConfig {
        /**
         * 注册ServletRegistrationBean
         * @return
         */
        @Bean
        public ServletRegistrationBean registrationBean() {
            ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
            /** 初始化参数配置,initParams**/
            //白名单
            //bean.addInitParameter("allow", "127.0.0.1");//多个ip逗号隔开
            //IP黑名单 (存在共同时,deny优先于allow)
            //bean.addInitParameter("deny", "192.168.1.73");
            //登录查看信息的账号密码.
            bean.addInitParameter("loginUsername", "admin");
            bean.addInitParameter("loginPassword", "123456");
            //是否能够重置数据.
            bean.addInitParameter("resetEnable", "false");
            return bean;
        }

        /**
         * 注册FilterRegistrationBean
         * @return
         */
        @Bean
        public FilterRegistrationBean druidStatFilter() {
            FilterRegistrationBean bean = new FilterRegistrationBean(new WebStatFilter());
            //添加过滤规则.
            bean.addUrlPatterns("/*");
            //添加不需要忽略的格式信息.
            bean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
            return bean;
        }
    }

第二种方式:(创建 DruidStatFilter 和 DruidStatViewServlet 两个类)
    package com.hokai.config;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.annotation.WebInitParam;
    import com.alibaba.druid.support.http.WebStatFilter;
    /**
     * WebStatFilter用于采集web-jdbc关联监控的数据。
     * 属性filterName声明过滤器的名称,(可选用)
     * 属性urlPatterns指定要过滤 的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性)
     */
    @WebFilter(filterName="druidWebStatFilter",
        urlPatterns="/*",
        initParams={  
            @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"),// 忽略资源  
        })
   // 第二种方式的DruidStatFilter 类
    public class DruidStatFilter extends WebStatFilter{

    }

//-----------------------------------------------------------------
    package com.hokai.config;
    import javax.servlet.annotation.WebInitParam;
    import javax.servlet.annotation.WebServlet;
    import com.alibaba.druid.support.http.StatViewServlet;
        /**
         * StatViewServlet用于展示Druid的统计信息。
         * 提供监控信息展示的html页面
         * 提供监控信息的JSON API
         *
         * 内置监控页面的首页是/druid/index.html
         */

        /**
         * @Webservlet
         * 有两个属性可以用来表示Servlet的访问路径,分别是value和urlPatterns。value和urlPatterns都是数组形式,
         * 表示我们可以把一个Servlet映射到多个访问路径,但是value和urlPatterns不能同时使用。
         */
     @WebServlet(urlPatterns = "/druid/*",
            initParams={      
            @WebInitParam(name="allow",value=""),// IP白名单 (没有配置或者为空,则允许所有访问)      
            @WebInitParam(name="deny",value="192.168.16.111"),// IP黑名单 (存在共同时,deny优先于allow)      
            @WebInitParam(name="loginUsername",value="admin"),// 用户名      
            @WebInitParam(name="loginPassword",value="admin"),// 密码      
            @WebInitParam(name="resetEnable",value="true")// 禁用HTML页面上的“Reset All”功能  
      })
       // 第二种方式的DruidStatViewServlet 类
      public class DruidStatViewServlet extends StatViewServlet {
            private static final long serialVersionUID = 1L;
      }
4. 以上全部配置完成后,我们可以启动项目来进行访问测试

4.1 打开浏览器输入路径: http://localhost:8088/druid/login.html(如果程序中设置了过滤器或拦截器需要将 /druid/**路径放开)
4.2 登录页面中输入我们在配置类中设置的账号密码进入Druid监控后台
4.3 登录成功以后,可以看到Druid主页面,但是我们点击 数据源选项卡(展示我们在application.properties中配置的那些参数)、SQL监控选项卡(监控并展示程序每次请求时运行的SQL语句)、SQL防火墙选项卡等可能看不到数据,这个是正常情况,sping boot 启动的时候没有进行数据库操作(也就是说程序不会主动与数据库进行连接交互操作,只有用户操作页面发出请求了,程序才会与数据库进行交互,如果程序已经和数据库有交互了,那么我们就能在数据源、SQL监控等页面看到Druid统计的监控数据了),所以这里就是这样。红色div块一直存在,是Druid代码里写死的;
4.4 我们先在页面执行一个操作与数据库交互后,可以在sql监控选项卡看到执行的sql等信息了
4.5 再查看数据源选项卡可以看到配置连接池参数也都生效了

注:4.4 和4.5 对4.3括号中的内容意思一致,只有与数据库交互了,Druid就能做数据库的监控了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值