🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## Inerceptor BeetlSql可以在执行sql前后执行一系列的Intercetor,从而有机会执行各种扩展和监控,这比通过过数据库连接池做监控更加容易。如下Interceptor都是有可能的 - 监控sql执行较长时间语句,打印并收集。TimeStatInterceptor 类完成 - 对每一条sql语句执行后输出其sql和参数,也可以根据条件只输出特定sql集合的sql。便于用户调试。DebugInterceptor,Slf4JLogInterceptor完成,或者子类SimpleDebugInterceptor - 有机会在执行jdbc查询前更改sql,更改参数等,甚至可以设置ThreadLocal参数从而在ConnectionSource子类里更改数据源 - 跟踪执行的sql和响应的参数 - 缓存功能(自带SimpleCacheInterceptor),可以通过before直接取得缓存结果而不需要查询JDBC,但需要注意的是,在DAO层缓存不如在Service层缓存更加灵活,很多web框架,比如SpringBoot 都支持桌子Service级别缓存 > DebugInterceptor ,Slf4JLogInterceptor类是常用类,会将sql和参数打印到控制台.前者使用控制台输出,后者使用slf4j接口 你也可以自行扩展Interceptor类,来完成特定需求。 如下,在执行数据库操作前会执行before,通过ctx可以获取执行的上下文参数,数据库成功执行后,会执行after方法,如果执行出错,会调用exception ```java public interface Interceptor { public void before(InterceptorContext ctx); public void after(InterceptorContext ctx); public void exception(InterceptorContext ctx,Exception ex); } ``` InterceptorContext 如下,executeContext参数,也就包含了sqlId,实际得sql,是查询还是修改,和实际得参数, 也包括执行结果result。对于查询,执行结果是查询返回的结果集条数,对于更新,返回的是成功条数, ```java private Map<String, Object> env = null; private ExecuteContext executeContext; ``` env变量可以用于InterceptorContext上下文保存临时变量,比如TimeStatInterceptor,调用before,保存当前时间到env里。调用after,取出保存的时间,得出整个jdbc调用时长 ```java @Override public void before(InterceptorContext ctx) { if(!include(ctx.getExecuteContext().sqlId)){ return; } ctx.setEnv(new HashMap<>()); ctx.getEnv().put("stat.time", System.currentTimeMillis()); } @Override public void after(InterceptorContext ctx) { if(!include(ctx.getExecuteContext().sqlId)){ return; } long end = System.currentTimeMillis(); long start = (Long) ctx.get("stat.time"); if ((end - start) > max) { ExecuteContext executeContext = ctx.getExecuteContext(); print(executeContext.sqlId.toString(), executeContext.sqlResult.jdbcSql, executeContext.sqlResult.jdbcPara, (end - start)); } } ```