阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句...

参考帖子:http://www.cnblogs.com/han-1034683568/p/6730869.html

Druid数据连接池简介

 

  • Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。
  • 性能好,同时自带监控页面,可以实时监控应用的连接池情况以及其中性能差的sql,方便我们找出应用中连接池方面的问题。

Druid是一个JDBC组件,它包括三部分:

  • DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系
  • DruidDataSource 高效可管理的数据库连接池
  • SQLParser

Druid可以做什么

  • 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
  • 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。
  • 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。
  • SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。

      

druid监控

  Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。

1、下载druid包 
Maven配置:


 
<dependency>
    <groupId>com.alibabagroupId>
    <artifactId>druidartifactId>
    <version>1.1.10version>
dependency>


<dependency>
    <groupId>org.slf4jgroupId>
    <artifactId>slf4j-apiartifactId>
    <version>1.7.25version>
dependency>

 最新版druid 引用了slf4j  所以需要一并加入,否则会报找不到slf4的错误。

2、applicationContext.xml 引入配置文件数据库连接相关信息  

  
    <bean id="propertyConfigurer"  
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
         <property name="location" value="classpath:jdbc.properties" />
    bean>  

阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句..._第1张图片 

jdbc.properties 中配置数据库链接信息:

jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@10.110.3.17:1521:实例名
jdbc.username=user
jdbc.password=password

3、applicationContext.xml数据源的配置:



<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
  init-method="init" destroy-method="close"> 
  <property name="driverClassName" value="${jdbc.driver}" /> 
  <property name="url" value="${jdbc.url}" /> 
  <property name="username" value="${jdbc.username}" /> 
  <property name="password" value="${jdbc.password}" /> 

   
  <property name="initialSize" value="10" /> 
  <property name="minIdle" value="10" /> 
  <property name="maxActive" value="50" />

   
  <property name="maxWait" value="10000" />

   
  <property name="timeBetweenEvictionRunsMillis" value="60000" />

   
  <property name="minEvictableIdleTimeMillis" value="300000" />

  <property name="testWhileIdle" value="true" />

   
  <property name="testOnBorrow" value="true" /> 
  <property name="testOnReturn" value="false" />

   
  <property name="poolPreparedStatements" value="true" /> 
  <property name="maxPoolPreparedStatementPerConnectionSize" 
   value="20" />

  

  <property name="defaultAutoCommit" value="true" />

   
  <property name="validationQuery" value="select 1 from dual" /> 
  <property name="filters" value="wall,stat" /> 
  <property name="proxyFilters"> 
   <list> 
    <ref bean="logFilter" /> 
    <ref bean="stat-filter" /> 
   list> 
  property> 
 bean>
     
    <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
        
        <property name="slowSqlMillis" value="50"/>
        <property name="logSlowSql" value="true"/>
    bean>
      <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> 
      <property name="dataSourceLogEnabled" value="true" />
      <property name="statementExecutableSqlLogEnable" value="true" />
     bean>
     
     
     

4、web.xml中加入监控配置: 只需要在web.xml中做一下简单的Servlet配置即可。


    <filter>
        <filter-name>DruidWebStatFilterfilter-name>
        <filter-class>com.alibaba.druid.support.http.WebStatFilterfilter-class>
        <init-param>
            <param-name>exclusionsparam-name>
            <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*param-value>
        init-param>
    filter>
    <filter-mapping>
        <filter-name>DruidWebStatFilterfilter-name>
        <url-pattern>/*url-pattern>
    filter-mapping>
    <servlet>
        <servlet-name>DruidStatViewservlet-name>
        <servlet-class>com.alibaba.druid.support.http.StatViewServletservlet-class>
        <init-param>
            
            <param-name>resetEnableparam-name>
            <param-value>falseparam-value>
        init-param>
        <init-param>
            
            <param-name>loginUsernameparam-name>
            <param-value>yournameparam-value>
        init-param>
        <init-param>
            
            <param-name>loginPasswordparam-name>
            <param-value>yourpasswordparam-value>
        init-param>
        
        
    servlet>
    <servlet-mapping>
        <servlet-name>DruidStatViewservlet-name>
        <url-pattern>/druid/*url-pattern>
    servlet-mapping>

 

重新构建工程并启动tomcat,启动项目http://ip:端口/项目名称/druid/   即可进入到druid监控面板的登录页面,如下图。

阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句..._第2张图片

输入在web.xml中配置的账号和密码即可进入监控后台,注意,配置的账号和密码是明文,你在这里配置什么就是什么,并没有经过加密。

阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句..._第3张图片

OK,我们看到系统的一些简述信息,当然,你也应该看到启动时间了.

接下来是比较重要的一个页面,SQL监控

阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句..._第4张图片

从这个页面里我们能看到网站从启动开始执行的sql语句统计,每一条语句的执行次数、执行时间之和、最慢执行时间、执行错误数等等多个统计指标,通过这个统计数据我们可以找出sql语句的执行规律及sql语句的不足之处,也可以通过错误数来定位程序的不足并及时修改。

 

在配置druid数据源时,做了如下配置,开启了druid防火墙。

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

因此在控制后台也能见到SQL防火墙面板,如下图所示:

阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句..._第5张图片

面板里是防御统计及sql的统计信息,这里用的是druid默认的一些过滤规则,并没有自定义复杂的防火墙规则,因此也不细说了。

 

开启慢sql监控

在SQL监控中,有一项关于sql执行最慢执行时间的统计,但是只有一个值,就是一条sql语句最慢的执行时间记录,其他执行时间是看不到的,只能通过总时间来进行粗略的估计,还有一个问题就是,一旦项目重启,这些记录就全都没了,因此制定对应的日志输出策略是极其必要的。
大致想法就是通过druid获取所有项目运行中的慢sql执行记录,并将这些数据输出到日志文件中,查了一下druid的资料,调试了一段时间,最终成功实现。

1、修改数据源配置,增加拦截器:

<property name="proxyFilters"> 
   <list> 
    <ref bean="logFilter" /> 
    <ref bean="stat-filter" /> 
   list> 
  property>

2、配置慢sql及日志拦截器:


    <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
        
        <property name="slowSqlMillis" value="50"/>
        <property name="logSlowSql" value="true"/>
    bean>
      <bean id="logFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> 
      <property name="dataSourceLogEnabled" value="true" />
      <property name="statementExecutableSqlLogEnable" value="true" />
     bean>

3、修改log4j 配置文件,增加慢sql日志的输出策略:

#--------------------增加druid监控日志输出
log4j.rootLogger=DEBUG, Console ,druid #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.java.sql.ResultSet=INFO log4j.logger.org.apache=INFO log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG #log4j.rootLogger=DEBUG,debug,druid # Druid -------------------增加Druid监控日志输出 log4j.logger.druid.sql=WARN,druid log4j.logger.druid.sql.DataSource=WARN,druid log4j.logger.druid.sql.Connection=WARN,druid log4j.logger.druid.sql.Statement=WARN,druid log4j.appender.druid=org.apache.log4j.DailyRollingFileAppender log4j.appender.druid.layout=org.apache.log4j.PatternLayout log4j.appender.druid.layout.ConversionPattern= [%d{HH\:mm\:ss}] %c{1} - %m%n log4j.appender.druid.datePattern='.'yyyy-MM-dd log4j.appender.druid.Threshold = WARN log4j.appender.druid.append=true log4j.appender.druid.File=${catalina.home}/logs/ssm-maven/druid-slow-sql.log

重启再去查看druid监控后台,可以看到跟原来有了一些差别,由于设置了慢sql的时间为大于50毫秒,所以执行时间大于50毫秒的都会被红色标注。

 阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句..._第6张图片

再去tomcat日志文件夹中查看日志文件,可以看到日志文件中已经存在配置的慢sql日志文件了,点击查看其中也已经有了慢sql记录的数据,慢sql以及这条sql语句执行的时间都有记录。

 

 

开启spring监控

在监控面板中看到有spring监控这个功能,如果没有进行配置,则功能不能用,查了一下druid的文档,最终开启了spring监控功能。

配置如下:

     
    <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.inspur.smvc.service.*value>
                <value>com.inspur.smvc.dao.*value>
            list>
        property>
    bean>
 
    <aop:config>
        <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut"/>
    aop:config>
    

再次查看spring监控页面,已经有了数据:

阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句..._第7张图片

原先的做法只能对sql语句及jdbc相关操作进行监控,无法监控到代码级别的运行,因此进一步设置,结合spring的AOP特性对代码的运行效果进行监控,druid可以做到方法级别的监控,这个功能可以让你发现方法的调用频率及方法的运行时间,及时做出调整和修正使得项目更健壮。

转载于:https://www.cnblogs.com/prefectjava/p/9397999.html

你可能感兴趣的:(数据库,java,web.xml)