zoukankan      html  css  js  c++  java
  • Spring+SpringMVC+MyBatis+easyUI整合优化篇(十一)数据层优化-druid监控及慢sql记录

    本文提要

    前文也提到过druid不仅仅是一个连接池技术,因此在将整合druid到项目中后,这一篇文章将去介绍druid的其他特性和功能,作为一个辅助工具帮助提升项目的性能,本文的重点就是两个字:监控。
    我的github地址点这里

    druid监控

    因为已经做了整合,所以这一步较为简单,只需要在web.xml中做一下简单的Servlet配置即可。

    <!--druid监控页面 -->
        <servlet>
            <servlet-name>DruidStatView</servlet-name>
            <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
            <init-param>
                <!-- 不允许清空统计数据 -->
                <param-name>resetEnable</param-name>
                <param-value>false</param-value>
            </init-param>
            <init-param>
                <!-- 用户名 -->
                <param-name>loginUsername</param-name>
                <param-value>yourname</param-value>
            </init-param>
            <init-param>
                <!-- 密码 -->
                <param-name>loginPassword</param-name>
                <param-value>yourpassword</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>DruidStatView</servlet-name>
            <url-pattern>/druid/*</url-pattern>
        </servlet-mapping>
        <!--druid监控页面 -->
    

    重新构建工程并启动tomcat,在浏览器中输入druid即可进入到druid监控面板的登录页面。
    登录页面

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

    OK,我们看到系统的一些简述信息,当然,你也应该看到启动时间了,没错,我就是在下班后9点多才开始写这篇博客的。

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

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

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

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

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

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

    但是再去点击其他几个页面的时候,发现页面中都是空数据,因为并没有开启druid相关的功能。这是比较粗糙些的做法,不用做其他配置,就是默认的filters配置加上Servlet配置,虽然也有监控和统计,但是并不是特别满足需求。

    开启慢sql监控

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

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

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

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

        <!-- 慢SQL记录 -->
        <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
            <!-- 慢sql时间设置,即执行时间大于200毫秒的都是慢sql -->
            <property name="slowSqlMillis" value="200"/>
            <property name="logSlowSql" value="true"/>
        </bean>
    
        <bean id="log-filter" class="com.alibaba.druid.filter.logging.Log4jFilter">
            <property name="dataSourceLogEnabled" value="true" />
            <property name="statementExecutableSqlLogEnable" value="true" />
        </bean>
    

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

    log4j.rootLogger=DEBUG,debug,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的时间为大于200毫秒,所以执行时间大于200毫秒的都会被红色标注。
    慢sql标红

    再去tomcat日志文件夹中查看日志文件,可以看到日志文件中已经存在配置的慢sql日志文件了,点击查看其中也已经有了慢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.ssm.maven.core.service.*</value>
                    <value>com.ssm.maven.core.dao.*</value>
                </list>
            </property>
        </bean>
    
        <aop:config>
            <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut"/>
        </aop:config>
    

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

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

    结语

    因为我想对网站的一些信息和运行情况进行监控,因此在代码中集成了druid的相关功能,也上传到了github仓库,如果你不需要的话,可以根据我在代码里写的注释删除相关配置文件即可。

  • 相关阅读:
    古老当时兴
    购买代购的产品算违法吗——看空姐代购被判刑有感
    七种方法让你的网站在搜索结果中突围而出(中)
    amf webgame
    游戏开发协议(转)
    array的排序
    用 javascript + actionScript 解决透明的flash在firefox下滚轮失效的问题!(转)
    知乎摘 励志回答
    ie:stagewidth,stageheight的bug
    jsfl bug解决
  • 原文地址:https://www.cnblogs.com/han-1034683568/p/6730869.html
Copyright © 2011-2022 走看看