druid升级后sql监控页面为空白的解决

druid升级后sql监控页面为空白

说明

springboot项目,集成druid,之前版本是1.1.10,后来直接升级成1.1.22

出现问题

sql监控为空:

数据源filter也为空:

解决过程

网上查询得知,filter类名应为com.alibaba.druid.filter.stat.StatFilter。

借助ide,找到了stat过滤器加载的关键信息。

在com.alibaba.druid.spring.boot.autoconfigure.stat.DruidFilterConfiguration配置类中,如下:

FILTER_STAT_PREFIX值为spring.datasource.druid.filter.stat

只有配置文件application.yml中有此配置项才会加载stat过滤器

部分druid配置项截图(数据源配置省略):

配置上此选项即可看到监控!

使用druid监控sql执行状态

使用Druid的连接池替换掉原来的C3P0连接池,然后配置Druid的相关属性,完成对Spring web工程的JDBC监控。

其实,我采用Druid替换其它连接池,最关键的一个理由是Druid有对SQL执行的监控统计功能。 :)

本文就是来看看看Druid的监控功能。~~~ 一起玩起来 : )

Druid介绍

Druid是一个JDBC组件库,包括数据库连接池、SQL Parser等组件。DruidDataSource是最好的数据库连接池。参考Druid wiki上的文章 <<各连接池的性能比较>>

Druild包获取

Maven工程中添加druid依赖包:

  <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
  <dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid</artifactId>
   <version>1.0.26</version>
  </dependency>

Druid使用

替换C3P0连接池

Web工程原先采用C3P0连接池的配置:

 <!-- 配置数据源-C3PO -->
 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
  destroy-method="close">
  <property name="driverClass" value="${jdbc.driverClassName}" />
  <property name="jdbcUrl" value="${jdbc.url}" />
  <property name="user" value="${jdbc.username}" />
  <property name="password" value="${jdbc.password}" />
  <property name="autoCommitOnClose" value="false" />
  <property name="maxIdleTime" value="${cpool.maxIdleTime}" />
  <property name="checkoutTimeout" value="${cpool.checkoutTimeout}" />
  <property name="initialPoolSize" value="${cpool.minPoolSize}" />
  <property name="minPoolSize" value="${cpool.minPoolSize}" />
  <property name="maxPoolSize" value="${cpool.maxPoolSize}" />
  <property name="acquireIncrement" value="${cpool.acquireIncrement}" />
  <property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}" />
 </bean>

改成Druid连接池DruidDataSource

 <!-- 配置数据源-druid -->
 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
  destroy-method="close">
  <property name="url" value="${jdbc.url}" />
  <property name="username" value="${jdbc.username}" />
  <property name="password" value="${jdbc.password}" />
  <property name="maxActive" value="20" />
  <property name="initialSize" value="1" />
  <property name="maxWait" value="60000" />
  <property name="minIdle" value="1" />
  <property name="timeBetweenEvictionRunsMillis" value="60000" />
  <property name="minEvictableIdleTimeMillis" value="300000" />
  <property name="testWhileIdle" value="true" />
  <property name="testOnBorrow" value="false" />
  <property name="testOnReturn" value="false" />
  <property name="poolPreparedStatements" value="true" />
  <property name="maxOpenPreparedStatements" value="20" />
 </bean>

StatViewServlet配置

Druid内置提供了一个StatViewServlet用于展示Druid的统计信息。

这个StatViewServlet的用途包括:

  • 提供监控信息展示的html页面
  • 提供监控信息的JSON API

StatViewServlet是一个标准的javax.servlet.http.HttpServlet,需要配置在你web应用中的WEB-INF/web.xml中。

 <servlet>
  <servlet-name>DruidStatView</servlet-name>
  <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>DruidStatView</servlet-name>
  <url-pattern>/druid/*</url-pattern>
 </servlet-mapping>

配置完之后,可以通过如下格式的地址在浏览器访问查看。

http:/<host>:<port>/<context>/druid

举个例子:

如果host为localhost,port为8080,context为Demo,那么,可以通过如下URL访问。

http://localhost:8080/Demo/druid

那么问题来了

查看的时候,能否提供用户名和密码作为验证呢,而不是直接就能看JDBC执行的状态信息?

答案是肯定的。

需要在上述配置的情况下,配置Servlet的 loginUsername 和 loginPassword这两个初始参数。

如:

	<servlet>
		<servlet-name>DruidStatView</servlet-name>
		<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
	  <init-param>
   		 <!-- 用户名 -->
    	 <param-name>loginUsername</param-name>
   		 <param-value>druid</param-value>
   	  </init-param>
      <init-param>
   	    <!-- 密码 -->
    	<param-name>loginPassword</param-name>
    	<param-value>druid</param-value>
      </init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>DruidStatView</servlet-name>
		<url-pattern>/druid/*</url-pattern>
	</servlet-mapping>

配置好之后,登录之后才能访问。

StatFilter配置

Druid内置提供一个StatFilter,用于统计监控信息。

如果没有配置StatFilter,那么,我们无法获取相关统计信息。

比如:

无法看到SQL监控TAB上的数据。

URI监控TAB中,无法获取JDBC相关的SQL执行信息。

如何展示出这些数据呢? 解决的办法就是配置StatFilter。

StatFilter的别名是stat,在spring中使用别名配置方式如下:

<property name="filters" value="stat" />

将上述stat添加到dataSource中去即可。

	<!-- 配置数据源-druid -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
		destroy-method="close">
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="filters" value="stat" />
		<property name="maxActive" value="20" />
		<property name="initialSize" value="1" />
		<property name="maxWait" value="60000" />
		<property name="minIdle" value="1" />
		<property name="timeBetweenEvictionRunsMillis" value="60000" />
		<property name="minEvictableIdleTimeMillis" value="300000" />
		<property name="testWhileIdle" value="true" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		<property name="poolPreparedStatements" value="true" />
		<property name="maxOpenPreparedStatements" value="20" />
	</bean>

添加完毕之后,再来看一下上述两个TAB ( SQL监控以及 URI监控)下JDBC的内容:

在SQL监控页面,可以很清楚地看到目前执行SQL的具体情况,包括某条SQL语句执行的时间(平均、最慢)、SQL执行次数、SQL执行出错的次数等。这些信息,可以作为系统SQL语句优化的一个指标。

在URI监控页,可以清楚地看到执行某个动作,关联SQL有多少,请求次数、执行时间、并发数等信息。

StatFilter可以和其他的Filter配置使用,比如, 与log4j组合使用。

<property name="filters" value="stat,log4j" />

这样,我们在点击 “记录日志并重置” 的按钮时,Console中就会输入JDBC相关日志,日志采用JSON的方式记录,如:

[INFO ][2016-11-15 20:11:11,677] com.alibaba.druid.pool.DruidDataSourceStatLoggerImpl.log(DruidDataSourceStatLoggerImpl.java:77) -
{"url":"jdbc:mysql://127.0.0.1:3306/Demo?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull","dbType":"mysql","name":"DataSource-958465974","activeCount":0,"poolingCount":1,"connectCount":0,"closeCount":0}

内置Filter别名和对应的Filter类名如下:

别名 Filter类名
default com.alibaba.druid.filter.stat.StatFilter
stat com.alibaba.druid.filter.stat.StatFilter
mergeStat com.alibaba.druid.filter.stat.MergeStatFilter
encoding com.alibaba.druid.filter.encoding.EncodingConvertFilter
log4j com.alibaba.druid.filter.logging.Log4jFilter
log4j2 com.alibaba.druid.filter.logging.Log4j2Filter
slf4j com.alibaba.druid.filter.logging.Slf4jLogFilter
commonlogging com.alibaba.druid.filter.logging.CommonsLogFilter

慢SQL记录

StatFilter属性slowSqlMillis用来配置SQL慢的标准,执行时间超过slowSqlMillis的就是慢。slowSqlMillis的缺省值为3000,也就是3秒。

<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
    <property name="slowSqlMillis" value="10000" />
    <property name="logSlowSql" value="true" />
</bean>

在上面的配置中,slowSqlMillis被修改为10秒,并且通过日志输出执行慢的SQL。

slowSqlMillis属性也可以通过connectProperties来配置,例如:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    ... ...
    <property name="filters" value="stat" />
    <property name="connectionProperties" value="druid.stat.slowSqlMillis=5000" />
  </bean>

Wallfilter配置

配置WallFilter,可以起到拦截作用,从而形成SQL的白名单和黑名单。

缺省情况下,配置装载的目录如下:

数据库类型 目录
mysql META-INF/druid/wall/mysql
oracle META-INF/druid/wall/oracle
sqlserver META-INF/druid/wall/sqlserver
postgres META-INF/druid/wall/postgres

从配置目录中以下文件中读取配置:

  deny-variant.txt
  deny-schema.txt
  deny-function.txt
  permit-variant.txt
  permit-variant.txt

指定配置装载的目录是可以指定,例如:

  <bean id="wall-filter-config" class="com.alibaba.druid.wall.WallConfig" init-method="init">
      <!-- 指定配置装载的目录  -->
      <property name="dir" value="META-INF/druid/wall/mysql" />
  </bean>

  <bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
      <property name="dbType" value="mysql" />
      <property name="config" ref="wall-filter-config" />
  </bean>

  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
      ...
      <property name="proxyFilters">
          <list>
              <ref bean="wall-filter"/>
          </list>
      </property>
  </bean>

本文实例中,采用如下的配置:

	<bean id="wall-filter-config" class="com.alibaba.druid.wall.WallConfig"
		init-method="init">
		<!-- 指定配置装载的目录 -->
		<property name="dir" value="META-INF/druid/wall/mysql" />
	</bean>

	<bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
		<property name="dbType" value="mysql" />
		<property name="config" ref="wall-filter-config" />
	</bean>

	<!-- 配置数据源-druid -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
		destroy-method="close">
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="filters" value="stat" />
		<property name="maxActive" value="20" />
		<property name="initialSize" value="1" />
		<property name="maxWait" value="60000" />
		<property name="minIdle" value="1" />
		<property name="timeBetweenEvictionRunsMillis" value="60000" />
		<property name="minEvictableIdleTimeMillis" value="300000" />
		<property name="testWhileIdle" value="true" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		<property name="poolPreparedStatements" value="true" />
		<property name="maxOpenPreparedStatements" value="20" />
		<property name="proxyFilters">
			<list>
				<ref bean="wall-filter" />
			</list>
		</property>
	</bean>

配置好Wallfilter, 我们就可以看到SQL防火墙 TAB下的内容了。

因为是默认状态,没有配置任何拦截的属性信息,所以,SQL的执行都在白名单中展示出来了。

配置Spring和jdbc的关联

最后,还有一个Tab的内容没有展示,那就是Spring监控。

Druid提供了Spring和Jdbc的关联监控。

本文在Spring的applicationContext.xml配置文件中配置如下信息,支持方法名的拦截。

	<bean id="druid-stat-interceptor"
		class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
	</bean>

	<bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut"
		scope="prototype">
		<property name="patterns">
			<list>
				<value>com.demo.mybatis.auto.*</value>
				<value>com.demo.mybatis.manual.*</value>
			</list>
		</property>
	</bean>
	<aop:config>
		<aop:advisor advice-ref="druid-stat-interceptor"
			pointcut-ref="druid-stat-pointcut" />
	</aop:config>

完工后,我们再去看一下,Spring监控的TAB内容,就可以看到相关的MyBatis Mapper执行信息。

在Spring监控页,可以显示相关DAO执行的方法,方法执行的次数、执行的时间等信息。

小结

通过上述几个部分的配置,监控页面上所有的TAB都可以查看信息了。

当然,Druid还有很多其他的功能,在这篇文章中就一一展示,有兴趣的朋友可以在Druid的Github网页上查看。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Spring Boot使用Druid和监控配置方法

    Spring Boot默认的数据源是:org.apache.tomcat.jdbc.pool.DataSource Druid是Java语言中最好的数据库连接池,并且能够提供强大的监控和扩展功能. 下面来说明如何在 Spring Boot 中配置使用Druid (1)添加Maven依赖 (或jar包)\ <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId&g

  • Spring Boot使用Druid进行维度的统计和监控

    Druid Druid:一款为监控而生的数据库连接池框架,整个项目由数据库连接池.插件框架和SQL解析器组成. Druid功能介于PowerDrill和Dremel之间,它几乎实现了Dremel的所有功能,并且从PowerDrill吸收一些有趣的数据格式.Druid允许以类似Dremel和PowerDrill的方式进行单表查询,同时还增加了一些新特性,如为局部嵌套数据结构提供列式存储格式.为快速过滤做索引.实时摄取和查询.高容错的分布式体系架构等. Spring Boot spring框架作为J

  • spring boot基于DRUID实现数据源监控过程解析

    这篇文章主要介绍了spring boot基于DRUID实现数据源监控过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 随着需求和技术的日益革新,spring boot框架是越来越流行,她也越来越多地出现在我们的项目中,当然最主要的原因还是因为spring boot构建项目实在是太爽了,构建方便,开发简单,而且效率高.今天我们并不是来专门学习spring boot项目的,我们要讲的是数据源的加密和监控,监控到好说,就是不监控也没什么问题,但

  • SpringBoot对Druid配置SQL监控功能失效问题及解决方法

    由于我使用的是properties类型的配置文件,在对druid的参数进行配置的时候,多加了druid,也就是spring.datasource.druid.xxx,运行sql语句后SQL监控功能无效. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/userinfo?useUnicode=true&characterEnc

  • druid升级后sql监控页面为空白的解决

    druid升级后sql监控页面为空白 说明 springboot项目,集成druid,之前版本是1.1.10,后来直接升级成1.1.22 出现问题 sql监控为空: 数据源filter也为空: 解决过程 网上查询得知,filter类名应为com.alibaba.druid.filter.stat.StatFilter. 借助ide,找到了stat过滤器加载的关键信息. 在com.alibaba.druid.spring.boot.autoconfigure.stat.DruidFilterCon

  • 多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法

    mint19.2   本来pip 和 pip2 对应 python2.7   pip3对应python3.6 用源码安装了python3.7之后. 这样 版本也没问题. 但是,  用pip3.7 安装包的时候 提示 pip需要升级,  但是一旦升级, 就不对了 pip  pip2 pip3 都指向了pip3.7 这导致一系列问题. 包pgadmin4 启动后报 csrf 错误 , 甚至进而导致docker-compose模式下postgres服务下线! 而且,无法用重装python-pip, p

  • vue.js打包项目后页面出现空白的解决办法

    相信很多刚刚接触vue的伙伴会遇到这样的问题,就是说vue项目在开发环境下一切正常,但是打包之后,打开index.html页面却是一片空白,打开控制台发现这样的错误 出现这种情况要分两个处理方式(vue-cli2和vue-cli3),先说vue-cli2: 首先找到config/index.js文件,将assetPublicPath的路径改为"./"即可, vue-cli3的话要稍微麻烦些,因为vue-cli3简洁了许多,没有了配置文件,所以需要自己创建,只能在项目的根目录下创建,并且

  • Ruby升级后no such file to load -- readline解决办法

    升级ruby和rails后进入script/consle出现: 复制代码 代码如下: /usr/local/lib/ruby/1.8/irb/completion.rb:10:in `require': no such file to load -- readline (LoadError)          from /usr/local/lib/ruby/1.8/irb/completion.rb:10          from /usr/local/lib/ruby/1.8/irb/in

  • SpringBoot集成Druid连接池进行SQL监控的问题解析

    Druid连接池是阿里巴巴开源的数据库连接池项目.Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能. Druid的监控统计功能是通过filter-chain扩展实现,采集的信息非常全面,包括SQL执行.并发.慢查.执行时间区间分布等.并且Druid内置提供了一个StatViewServlet用于展示Druid的统计信息,提高html页面展示非常完备的监控信息,可以快速诊断系统的瓶颈. 而Druid增加StatFilter之后,能采集大量统计信息,同时对性能基本没有影响.Stat

  • Spring集成Druid连接池及监控配置的全过程

    目录 前言 如何集成Druid 1.增加相关依赖 2.配置DataSource 3.配置项参数application.properties 4.代码相关 5.启动验证 druid的内置filters 拦截器stat(default.counter) 拦截器mergeStat 拦截器encoding 拦截器 log4j(log4j2.slf4j.commonlogging.commonLogging) 拦截器wall 拦截器Config Druid和HikariCP如何选择 总结 前言 前一篇文章

  • 解决druid监控页面SQL不显示的问题

    druid监控页面SQL不显示 如果可以正常访问界面,系统与数据库有交互,但是druid页面SQL监控却没数据 第一步查看[数据源] 检查filter是否没数据 第二步若没有数据,则查看自己的配置类 可以程序编写filterRegistrationBean,并通过@Bean自动加载 @Configuration public class DruidConfig { @Value("${druid.login.user_name}") private String userName; @

  • SpringBoot集成Druid监控页面最小化配置操作

    在项目中使用阿里的druid连接池,pom文件配置: <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>com.alibaba</groupId&g

  • springboot项目中实现访问druid内置监控页面

    springboot 访问druid内置监控页面 1.首先加入druid依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.9</version> </dependency> 2.设置配置文件: # 数据库访问配置 # 主数据源,默认的 spr

随机推荐