package org.jdbcdslog;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.Statement;
import java.util.Arrays;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StatementLoggingProxy implements InvocationHandler {
static Logger logger = LoggerFactory.getLogger(StatementLoggingProxy.class);
Object targetStatement = null;
static List executeMethods = Arrays.asList(new String[]{"addBatch", "execute", "executeQuery", "executeUpdate"});
public StatementLoggingProxy(Statement statement) {
targetStatement = statement;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object r = null;
try {
boolean toLog = (StatementLogger.logger.isInfoEnabled()
|| SlowQueryLogger.logger.isInfoEnabled()) && executeMethods.contains(method.getName());
long t1 = 0;
if(toLog)
t1 = System.currentTimeMillis();
r = method.invoke(targetStatement, args);
if(r instanceof ResultSet)
r = ResultSetLoggingProxy.wrapByResultSetProxy((ResultSet)r);
if(toLog) {
long t2 = System.currentTimeMillis();
StringBuffer sb = LogUtils.createLogEntry(method, args[0], null, null);
long time = t2 - t1;
String logEntry = sb.append(" ").append(time).append(" ms.").toString();
StatementLogger.logger.info(logEntry);
if(time >= ConfigurationParameters.slowQueryThreshold)
SlowQueryLogger.logger.info(logEntry);
}
} catch(Throwable t) {
LogUtils.handleException(t, StatementLogger.logger, LogUtils.createLogEntry(method, args[0], null, null));
}
return r;
}
}