如何使用Druid监控sql
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Druid监控sql相关的知识,希望对你有一定的参考价值。
参考技术A 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
druid配置logback日志记录慢sql以及应用数据源监控开启
性能排查在数据源方面,通过使用druid提供的慢sql日志记录以及应用数据源监控来跟踪,分析,定位应用上的性能问题。
基于druid配置开启慢sql的例子很多,大部分都是使用log4j,但项目中使用的是logback,所以一下都是基于logback的配置。
1.druid慢日志记录的开启配置
1.1 配置Filter
<!-- 慢SQL记录 --> <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter"> <!-- 慢sql时间设置,即执行时间大于1000毫秒的都是慢sql --> <property name="slowSqlMillis" value="1000"/> <property name="logSlowSql" value="true"/> </bean> <bean id="log-filter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> <property name="dataSourceLogEnabled" value="true" /> <property name="statementExecutableSqlLogEnable" value="true"/> </bean>
1.2 数据源使用Filter
<bean id="ims-druidDataSource-adb" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close" primary="false"> <property name="url" value="${spring.datasource.adb.url}"/> <property name="username" value="${spring.datasource.adb.username}"/> <property name="password" value="${spring.datasource.adb.password}"/> <property name="driverClassName" value="${spring.datasource.adb.driver-class-name}"/> <!--druid数据源使用Filter --> <property name="proxyFilters"> <list> <ref bean="stat-filter"/> <ref bean="log-filter"/> </list> </property>
</bean>
1.3配置logback
<appender name="DruidFILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${LOG_HOME}/log_druid_slow_sql.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_HOME}/log-druid_slow_sql-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始, 命名日志文件,例如log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>200MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 追加方式记录日志 --> <append>true</append> <!-- 日志文件的格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <logger name="com.alibaba.druid.filter.stat.StatFilter" level="ERROR"> <appender-ref ref="DruidFILE" /> </logger>
效果如下:会在日志目录按天生成日志文件,将慢sql记录到日志文件中。
2.配置druid内置监控页面(基于springboot)
直接上代码:
import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; 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 java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * <P> * 描述:druidCofig监控 * </p> * * @author lishang Created on 2020/5/8 17:24 * @version 1.0 */ @Configuration public class DruidConfig { //1.配置管理后台的servlet @Bean public ServletRegistrationBean statViewServlet(){ //druid监控页面的url ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*"); Map<String,String> initParams = new HashMap<>(); initParams.put("loginUsername","druid"); //登陆用户名 initParams.put("loginPassword","123456"); //密码 initParams.put("allow",""); //允许哪些ip initParams.put("deny",""); //拒绝ip bean.setInitParameters(initParams); return bean; } //2.配置一个web监控的filter,监控sql @Bean public FilterRegistrationBean webStatFilter(){ FilterRegistrationBean bean = new FilterRegistrationBean(); bean.setFilter(new WebStatFilter()); Map<String,String> initParams = new HashMap<>(); initParams.put("exclusions","*.js,*.css,*.html,/druid/*"); bean.setInitParameters(initParams); bean.setUrlPatterns(Arrays.asList("/*")); return bean; } }
然后, 就可以通过也没访问了,如下:
数据源相关信息,一目了然:
不得不承认,durid提供的相关监控使用起来方便,功能也是十分强大。
有了强大的监控支持,慢慢去定位系统的性能瓶颈去吧,希望通过我们的努力可以给客户更好用户体验。
以上是关于如何使用Druid监控sql的主要内容,如果未能解决你的问题,请参考以下文章