Skip to content

Slow SQL Logging and Monitoring (since v3.7.0) ​

Since v3.7.0, Bean Searcher has provided slow SQL logging and monitoring functionality.

Slow SQL Threshold ​

The slow SQL threshold refers to the minimum execution time for a SQL statement to be considered a slow SQL. It is the criterion for determining whether a SQL statement is a slow SQL, with the unit being ms and the default value being 500. Of course, it can also be modified through configuration.

SpringBoot / Grails Configuration Items (using the bean-searcher-boot-starter dependency) ​

Configuration KeyMeaningTypeDefault Value
bean-searcher.sql.slow-sql-thresholdSlow SQL threshold (unit: milliseconds)int500

Non-Boot Spring Configuration Method (using the bean-searcher dependency) ​

xml
<bean id="sqlExecutor" class="cn.zhxu.bs.implement.DefaultSqlExecutor">
    <property name="dataSource" ref="dataSource" />
    <!-- Configure the slow SQL threshold -->
    <property name="slowSqlThreshold" value="500" />
</bean>
<!-- Declare the MapSearcher retriever, which returns query results as Map objects -->
<bean id="mapSearcher" class="cn.zhxu.bs.implement.DefaultMapSearcher">
    <!-- Omit other property configurations; the BeanSearcher retriever has the same configuration -->
    <property name="sqlExecutor" ref="sqlExecutor" />
</bean>

Others ​

java
DefaultSqlExecutor sqlExecutor = new DefaultSqlExecutor(getDefaultDataSource());
// Configure the slow SQL threshold
sqlExecutor.setSlowSqlThreshold(500);
MapSearcher mapSearcher = SearcherBuilder.mapSearcher()
        // Omit other property configurations; the BeanSearcher retriever has the same configuration
        .sqlExecutor(sqlExecutor)
        .build();

Enable Slow SQL Logging ​

The log level for slow SQL is WARN. Therefore, you can enable slow SQL logging by adjusting the log level of cn.zhxu.bs.implement.DefaultSqlExecutor to WARN | INFO | DEBUG.

Log Effect (Execution Time, SQL, Execution Parameters, Entity Class):

log
14:55:02.151 WARN - bean-searcher [600ms] slow-sql: [select count(*) s_count from employee e where (e.type = ?)] params: [1] on [com.example.sbean.Employee]

Reference: Getting Started > Usage > SQL Logging section.

Monitor Slow SQL Events ​

Sometimes, we need to monitor slow SQL events in the code for further custom processing (e.g., sending warning notifications).

SpringBoot / Grails (using the bean-searcher-boot-starter dependency). Just configure a Bean. ​

java
@Bean
public SqlExecutor.SlowListener slowSqlListener() {
    return (
        Class<?> beanClass,     // The entity class where the slow SQL occurred 
        String slowSql,         // The slow SQL string
        List<Object> params,    // SQL execution parameters
        long timeCost           // Execution time (unit: ms)
    ) -> {
        // TODO: Monitoring processing
    }
}

Non-Boot Spring Projects ​

xml
<bean id="sqlExecutor" class="cn.zhxu.bs.implement.DefaultSqlExecutor">
    <property name="dataSource" ref="dataSource" />
    <!-- Configure the slow SQL listener -->
    <property name="slowListener">
        <!-- Customize MySlowSqlListener to implement the SqlExecutor.SlowListener interface -->
        <bean class="com.example.MySlowSqlListener" />
    </property>
</bean>
<!-- Declare the MapSearcher retriever, which returns query results as Map objects -->
<bean id="mapSearcher" class="cn.zhxu.bs.implement.DefaultMapSearcher">
    <!-- Omit other property configurations; the BeanSearcher retriever has the same configuration -->
    <property name="sqlExecutor" ref="sqlExecutor" />
</bean>

Others ​

java
DefaultSqlExecutor sqlExecutor = new DefaultSqlExecutor(getDefaultDataSource());
// Configure the slow SQL listener
sqlExecutor.setSlowListener((
    Class<?> beanClass,     // The entity class where the slow SQL occurred 
    String slowSql,         // The slow SQL string
    List<Object> params,    // SQL execution parameters
    long timeCost           // Execution time (unit: ms)
) -> {
    // TODO: Monitoring processing
});
MapSearcher mapSearcher = SearcherBuilder.mapSearcher()
        // Omit other property configurations; the BeanSearcher retriever has the same configuration
        .sqlExecutor(sqlExecutor)
        .build();

Released under the Apache License