package li.druid; import li.aop.AopChain; import li.aop.AopFilter; import com.alibaba.druid.filter.stat.StatFilterContext; import com.alibaba.druid.filter.stat.StatFilterContextListenerAdapter; import com.alibaba.druid.support.spring.stat.SpringMethodInfo; import com.alibaba.druid.support.spring.stat.SpringMethodStat; import com.alibaba.druid.support.spring.stat.SpringStat; import com.alibaba.druid.support.spring.stat.SpringStatManager; /** * com.alibaba.druid.support.spring.stat.DruidStatInterceptor * * @author 明伟 */ public class StatAopFilter implements AopFilter { private static SpringStat springStat = new SpringStat(); public StatAopFilter() throws Exception { SpringStatManager.getInstance().addSpringStat(springStat); StatFilterContext.getInstance().addContextListener(new MethodContextListener()); } public void doFilter(AopChain chain) { SpringMethodStat lastMethodStat = SpringMethodStat.current(); SpringMethodInfo methodInfo = new SpringMethodInfo(chain.getMethod().getDeclaringClass()/* chain.getTarget().getClass() */, chain.getMethod()); SpringMethodStat methodStat = springStat.getMethodStat(methodInfo, true);// ## Throwable error = null; methodStat.beforeInvoke();// ## long startNanos = System.nanoTime(); try { chain.doFilter();// ## } catch (Throwable e) { throw new RuntimeException(e + " ", error = e);// ## } finally { methodStat.afterInvoke(error, System.nanoTime() - startNanos);// ## SpringMethodStat.setCurrent(lastMethodStat);// ## } } /** * MethodContextListener */ private class MethodContextListener extends StatFilterContextListenerAdapter { public void addUpdateCount(int updateCount) { SpringMethodStat springMethodStat = SpringMethodStat.current(); if (springMethodStat != null) springMethodStat.addJdbcUpdateCount(updateCount); } public void addFetchRowCount(int fetchRowCount) { SpringMethodStat springMethodStat = SpringMethodStat.current(); if (springMethodStat != null) springMethodStat.addJdbcFetchRowCount(fetchRowCount); } public void executeBefore(String sql, boolean inTransaction) { SpringMethodStat springMethodStat = SpringMethodStat.current(); if (springMethodStat != null) springMethodStat.incrementJdbcExecuteCount(); } public void executeAfter(String sql, long nanos, Throwable error) { SpringMethodStat springMethodStat = SpringMethodStat.current(); if (springMethodStat != null) { springMethodStat.addJdbcExecuteTimeNano(nanos); if (error != null) springMethodStat.incrementJdbcExecuteErrorCount(); } } public void commit() { SpringMethodStat springMethodStat = SpringMethodStat.current(); if (springMethodStat != null) springMethodStat.incrementJdbcCommitCount(); } public void rollback() { SpringMethodStat springMethodStat = SpringMethodStat.current(); if (springMethodStat != null) springMethodStat.incrementJdbcRollbackCount(); } public void pool_connect() { SpringMethodStat springMethodStat = SpringMethodStat.current(); if (springMethodStat != null) springMethodStat.incrementJdbcPoolConnectionOpenCount(); } public void pool_close(long nanos) { SpringMethodStat springMethodStat = SpringMethodStat.current(); if (springMethodStat != null) springMethodStat.incrementJdbcPoolConnectionCloseCount(); } public void resultSet_open() { SpringMethodStat springMethodStat = SpringMethodStat.current(); if (springMethodStat != null) springMethodStat.incrementJdbcResultSetOpenCount(); } public void resultSet_close(long nanos) { SpringMethodStat springMethodStat = SpringMethodStat.current(); if (springMethodStat != null) springMethodStat.incrementJdbcResultSetCloseCount(); } } }