Mybatis拦截器实现SQL性能监控

摘要:
Mybatis拦截器只能拦截四种类型的对象,即Executor、ParameterHandler、StatementHandler和ResultSetHandler。SQL数据库操作从Executor开始,因此要记录Mybatis数据库操作的时间消耗,需要截取Execut类。代码实现如下:/**数据库操作性能拦截器。录制时间消耗*@Intercepts定义了签名数组,因此您可以拦截

Mybatis拦截器只能拦截四类对象,分别为:Executor、ParameterHandler、StatementHandler、ResultSetHandler,而SQL数据库的操作都是从Executor开始,因此要记录Mybatis数据库操作的耗时,需要拦截Executor类,代码实现如下:

/*** 数据库操作性能拦截器,记录耗时
 * @Intercepts定义Signature数组,因此可以拦截多个,但是只能拦截类型为:
 *         Executor
 *         ParameterHandler
 *         StatementHandler
 *         ResultSetHandler
 * */@Intercepts(value ={ 
        @Signature (type=Executor.class,
                method="update",
                args={MappedStatement.class,Object.class}),
        @Signature(type=Executor.class,
        method="query",
        args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class,
                CacheKey.class,BoundSql.class}),
        @Signature(type=Executor.class,
        method="query",
        args={MappedStatement.class,Object.class,RowBounds.class,ResultHandler.class})})
public class TimerInterceptor implementsInterceptor {

    private static final Logger logger = Logger.getLogger(TimerInterceptor.class);
    
    /*** 实现拦截的地方
     * */@Override
    public Object intercept(Invocation invocation) throwsThrowable {
        Object target =invocation.getTarget();
        Object result = null;
        if (target instanceofExecutor) {
            long start =System.currentTimeMillis();
            Method method =invocation.getMethod();
            /**执行方法*/result =invocation.proceed();
            long end =System.currentTimeMillis();
            logger.info("[TimerInterceptor] execute [" + method.getName() + "] cost [" + (end - start) + "] ms");
        }
        returnresult;
    }

    /*** Plugin.wrap生成拦截代理对象
     * */@Override
    publicObject plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public voidsetProperties(Properties properties) {

    }

}

完成上面的拦截后,需要将该类在Mybatis配置文件中声明,如下:

<plugins>
     <!--SQL性能拦截器 -->
     <plugin interceptor="com.quar.interceptor.TimerInterceptor" />
</plugins>

免责声明:文章转载自《Mybatis拦截器实现SQL性能监控》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇王宫对话脚本(4.8)OD与调试符号下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mybatis 详解(六)------通过mapper接口加载映射文件

通过 mapper 接口加载映射文件,这对于后面 ssm三大框架 的整合是非常重要的。那么什么是通过 mapper 接口加载映射文件呢?   我们首先看以前的做法,在全局配置文件 mybatis-configuration.xml 通过 <mappers> 标签来加载映射文件,那么如果我们项目足够大,有很多映射文件呢,难道我们每一个映射文件都这...

javabean与map互转

/*** 将一个 JavaBean 对象转化为一个 Map* @param bean 要转化的JavaBean 对象* @return 转化出来的 Map 对象* @throws Exception */ public static Map convertBean(Object bean){Map returnMap = new HashMap(); if...

多线程中Object的wait(),notify()和Condition的wait()和singal()对锁的关联

通常将共享资源的操作放置在Sysnchronized定义的区域内,这样当其他线程也获取到这个锁时,必须的等待锁被释放时才能进入该区域。Object为任意一个对象,每个对象都存在一个标志位,并具有两个值,分别为0和1。一个线程运行到同步块时,首先检查该对象的标志位,如果为0状态,表明此同步块中存在其他线程在运行。这时该线程处于就绪状态,直到处于同步块中的线程...

Mybatis中的DataSource配置

dataSource 的类型可以配置成其内置类型之一,如 UNPOOLED,POOLED,JNDI。 1、如果将类型设置成 UNPOOLED,MyBatis 会为每一个数据库操作创建一个新的连接,并关闭它。该方式 适用于只有小规模数量并发用户的简单应用程序上。 2、 如果将属性设置成 POOLED,MyBatis 会创建一个数据库连接池,连接池中的一个连接...

ES6 对象的扩展

一、属性的简洁表示法 ES6 允许直接写入变量和函数,作为对象的属性和方法 let a=1; let b=2; let es5={a:a,b:b}; // 等同于 let es6={a,b}; 上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值 同样的,如果对象是方法,也可以简写: let es5={...

WPF值通用的类型转换器详解(转)

http://www.dxysoft.com/article/html/4005.html 在WPF中应用数据绑定时经常需要做一些简单的逻辑判断。比如ViewModel中有一个HasError(布尔值)的属性表示是否有错误。我需要将它绑定于Button的IsEnable属性上,即:当没有错误时Button可用。 这时就需要将HasError取反。WPF默...