Advertisement
Guest User

Untitled

a guest
Jul 31st, 2015
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.52 KB | None | 0 0
  1. package org.openbravo.base;
  2.  
  3. import java.lang.reflect.InvocationHandler;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Proxy;
  6. import java.sql.PreparedStatement;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9.  
  10. import javax.enterprise.context.ApplicationScoped;
  11.  
  12. import org.apache.tomcat.jdbc.pool.ConnectionPool;
  13. import org.apache.tomcat.jdbc.pool.JdbcInterceptor;
  14. import org.apache.tomcat.jdbc.pool.PooledConnection;
  15. import org.openbravo.database.PoolInterceptorProvider;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18.  
  19. @ApplicationScoped
  20. public class PoolInterceptor extends JdbcInterceptor implements PoolInterceptorProvider {
  21.  
  22.   private static final Logger log = LoggerFactory.getLogger(PoolInterceptor.class);
  23.  
  24.   // TODO: make these params configurable at runtime
  25.   private static final long minDurationStatements = 100L;
  26.   private static final boolean logParamValues = true;
  27.   private static final boolean logStatementStackTrace = true;
  28.  
  29.   @Override
  30.   public void reset(ConnectionPool parent, PooledConnection con) {
  31.     // System.out.println("connection borrowed " + con);
  32.  
  33.   }
  34.  
  35.   @Override
  36.   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  37.     // System.out.println("invoke " + method.getName());
  38.  
  39.     Object chain = super.invoke(proxy, method, args);
  40.     // for prepared statements, return a proxy so we can log info about params and execution time
  41.     if (compare("prepareStatement", method) && chain instanceof PreparedStatement) {
  42.       return Proxy.newProxyInstance(PoolInterceptorProvider.class.getClassLoader(),
  43.           new Class<?>[] { PreparedStatement.class }, new PSInvokationHandler(
  44.               (PreparedStatement) chain, (String) args[0]));
  45.     }
  46.     return chain;
  47.   }
  48.  
  49.   @Override
  50.   public void disconnected(ConnectionPool parent, PooledConnection con, boolean finalizing) {
  51.     System.out.println("disconnect " + con);
  52.     super.disconnected(parent, con, finalizing);
  53.   }
  54.  
  55.   @Override
  56.   public String getPoolInterceptorsClassNames() {
  57.     String fullClassName = this.getClass().getName();
  58.     return fullClassName + ";";
  59.   }
  60.  
  61.   private static class PSInvokationHandler implements InvocationHandler {
  62.  
  63.     private PreparedStatement ps;
  64.     private String sql;
  65.     private List<String> params;
  66.  
  67.     public PSInvokationHandler(PreparedStatement ps, String sql) {
  68.       this.ps = ps;
  69.       this.sql = sql;
  70.       if (logParamValues) {
  71.         params = new ArrayList<String>();
  72.       }
  73.     }
  74.  
  75.     @Override
  76.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  77.       String methodName = method.getName();
  78.  
  79.       if (logParamValues && methodName.startsWith("set") && args.length == 2) {
  80.         // setting parameters, keep them so we can display values if required
  81.         params.add("\n     $" + args[0] + ": " + args[1]);
  82.       }
  83.  
  84.       long t = System.currentTimeMillis();
  85.  
  86.       Object obj = method.invoke(ps, args);
  87.  
  88.       long totalTime = System.currentTimeMillis() - t;
  89.       if (totalTime > minDurationStatements) {
  90.         StringBuilder logMsg = new StringBuilder();
  91.         logMsg.append(methodName + " --- SQL: \n" + sql + "\n  t:" + totalTime);
  92.  
  93.         if (logParamValues) {
  94.           for (String param : params) {
  95.             logMsg.append(param);
  96.           }
  97.         }
  98.         if (logStatementStackTrace) {
  99.           log.info(logMsg.toString(), new Exception());
  100.         } else {
  101.           log.info(logMsg.toString());
  102.         }
  103.       }
  104.       return obj;
  105.     }
  106.  
  107.   }
  108.  
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement