【问题标题】:Mybatis excute slowMybatis 执行慢
【发布时间】:2020-06-30 04:33:41
【问题描述】:

我的项目执行 sql 非常慢,每条 sql 花费超过 3 秒。我的数据库中的数据非常少。
我已经尝试了多种变体,但似乎都没有奏效。有任何想法吗?

配置

  • springboot1.3.1
  • mybatis3.2.8
  • 德鲁伊1.0.16。

调试信息

application.properties

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
       default-lazy-init="false">


    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
          destroy-method="close">

        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>


        <property name="initialSize" value="20"/>
        <property name="minIdle" value="100"/>
        <property name="maxActive" value="100"/>


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

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

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

        <property name="validationQuery" value="select 1"/>
        <property name="testWhileIdle" value="true"/>
        <property name="testOnBorrow" value="false"/>
        <property name="testOnReturn" value="false"/>


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


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

    </bean>

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

    <bean id="jdbc"
          class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
        <constructor-arg ref="dataSource"/>
    </bean>

    <bean id="jdbcCall" scope="prototype"
          class="org.springframework.jdbc.core.simple.SimpleJdbcCall">
        <constructor-arg ref="dataSource"/>
    </bean>
</beans>

【问题讨论】:

  • 如果您使用的是 Spring Boot,为什么要使用 xml?那不是 application.properties 而是一个 xml 文件。为什么SimpleJdbcCall 原型是作用域的(构造后它是线程安全的)?你是如何执行的?总而言之,问题太多,信息太少,无法回答这个问题。
  • @Vastzhang 我对德鲁伊不熟悉,但可能值得尝试删除filters(我不知道他们在做什么。这只是一种预感)。如果你可以分享一个像these 这样复制性能问题的小项目,我会调查一下。顺便说一句,您似乎使用的是非常旧的版本。您应该考虑升级它们。 :D

标签: mysql spring-boot mybatis druid


【解决方案1】:

我发现了问题,这个项目使用logback发送日志给ELK,但是ELK的redis服务宕机了。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="AppName" value="Docx"/>

    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${AppName} %d %-5p [%thread] %c:%L - %m%n</pattern>
        </encoder>
    </appender>

    <appender name="logstash" class="com.cwbase.logback.RedisAppender">
        <source>*</source>
        <type>*</type>
        <host>*</host>
        <key>*</key>  
        <tags>*</tags>
        <port>*</port>
        <mdc>true</mdc>
        <location>true</location>
        <callerStackIndex>0</callerStackIndex>
        <level>INFO</level>
    </appender>

    <appender name="errorFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/error/error</File>
        <encoder>
            <pattern>%d [%thread] %c:%L-%m%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/error/error_%d{yyyy-MM-dd}</fileNamePattern>
        </rollingPolicy>

        <!-- <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>DEBUG</level>

            <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> -->
    </appender>

    <appender name="sqlFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>logs/sql/slow</File>
        <encoder>
            <pattern>%d [%thread] %c:%L-%m%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/sql/slow_%d{yyyy-MM-dd}</fileNamePattern>
        </rollingPolicy>
    </appender>
    <logger name="com.alibaba.druid.filter.stat.StatFilter" additivity="false" level="DEBUG">
        <appender-ref ref="sqlFile"/>
    </logger>



    <logger name="org" level="ERROR"/>

    <root level="DEBUG">
        <appender-ref ref="stdout"/>
<!--        <appender-ref ref="logstash"/>-->
    </root>


</configuration>

注解&lt;appender-ref ref="logstash"/&gt;后正常工作。

【讨论】: