Skip to content

慢 SQL 日志与监听(since v3.7.0)

v3.7.0 起 Bean Searcher 提供了慢 SQL 日志与 监听功能。

慢 SQL 阈值

慢 SQL 阈值指的是慢 SQL 的最小执行耗时,它是判断一个 SQL 是否为慢 SQL 的标准,单位 ms,默认值为 500。当然也可以通过配置修改。

SpringBoot / Grails 配置项(使用 bean-searcher-boot-starter 依赖)

配置键名含义类型默认值
bean-searcher.sql.slow-sql-threshol慢 SQL 阈值(单位:毫秒)int500

非 Boot 的 Spring 配置方法(使用 bean-searcher 依赖)

xml
<bean id="sqlExecutor" class="cn.zhxu.bs.implement.DefaultSqlExecutor">
    <property name="dataSource" ref="dataSource" />
    <!-- 配置慢 SQL 阈值 -->
    <property name="slowSqlThreshold" value="500" />
</bean>
<!-- 声明 MapSearcher 检索器,它查询的结果是 Map 对象 -->
<bean id="mapSearcher" class="cn.zhxu.bs.implement.DefaultMapSearcher">
    <!-- 省略其它属性配置,BeanSearcher 检索器也同此配置 -->
    <property name="sqlExecutor" ref="sqlExecutor" />
</bean>

Others

java
DefaultSqlExecutor sqlExecutor = new DefaultSqlExecutor(getDefaultDataSource());
// 配置慢 SQL 阈值
sqlExecutor.setSlowSqlThreshold(500);
MapSearcher mapSearcher = SearcherBuilder.mapSearcher()
        // 省略其它属性配置,BeanSearcher 检索器也同此配置
        .sqlExecutor(sqlExecutor)
        .build();

开启慢 SQL 日志

慢 SQL 的日志级别为 WARN,所以,只需将 cn.zhxu.bs.implement.DefaultSqlExecutor 的日志级别调整为 WARN | INFO | DEBUG 即可开启。

日志效果(执行耗时SQL执行参数实体类):

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]

参考:起步 > 使用 > SQL 日志 章节。

监听慢 SQL 事件

有时候我们需要在代码中监听慢 SQL 事件,以便做进一步的自定义处理(比如:发送警告通知)。

SpringBoot / Grails(使用 bean-searcher-boot-starter 依赖)只需配置一个 Bean 即可

java
@Bean
public SqlExecutor.SlowListener slowSqlListener() {
    return (
        Class<?> beanClass,     // 发生慢 SQL 的实体类 
        String slowSql,         // 慢 SQL 字符串
        List<Object> params,    // SQL 执行参数
        long timeCost           // 执行耗时(单位:ms)
    ) -> {
        // TODO: 监听处理
    }
}

非 Boot 的 Spring 项目

xml
<bean id="sqlExecutor" class="cn.zhxu.bs.implement.DefaultSqlExecutor">
    <property name="dataSource" ref="dataSource" />
    <!-- 配置 慢 SQL 监听器 -->
    <property name="slowListener">
        <!-- 自定义 MySlowSqlListener 实现 SqlExecutor.SlowListener 接口 -->
        <bean class="com.example.MySlowSqlListener" />
    </property>
</bean>
<!-- 声明 MapSearcher 检索器,它查询的结果是 Map 对象 -->
<bean id="mapSearcher" class="cn.zhxu.bs.implement.DefaultMapSearcher">
    <!-- 省略其它属性配置,BeanSearcher 检索器也同此配置 -->
    <property name="sqlExecutor" ref="sqlExecutor" />
</bean>

Others

java
DefaultSqlExecutor sqlExecutor = new DefaultSqlExecutor(getDefaultDataSource());
// 配置慢 SQL 监听器
sqlExecutor.setSlowListener((
    Class<?> beanClass,     // 发生慢 SQL 的实体类 
    String slowSql,         // 慢 SQL 字符串
    List<Object> params,    // SQL 执行参数
    long timeCost           // 执行耗时(单位:ms)
) -> {
    // TODO: 监听处理
});
MapSearcher mapSearcher = SearcherBuilder.mapSearcher()
        // 省略其它属性配置,BeanSearcher 检索器也同此配置
        .sqlExecutor(sqlExecutor)
        .build();

基于 Apache 许可发布