不能打印sql,那么開發調試又需要sql,怎么辦呢?
容器化后,可以修改環境上的jdbc.properties:
jdbc.url后面加?statementInterceptors=MySQLStatementInterceptor
例如:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://10.146.200.243:3306/monalarmdb?statementInterceptors=MySQLStatementInterceptor
jdbc.username=root
jdbc.password=root
將附件中的class解壓放入WEB-INF/classes目錄下。
這樣,開啟INFO級別日志,會打印出每條發送給mysql驅動執行的sql語句。
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.ResultSetInternalMethods;
import com.mysql.jdbc.Statement;
import com.mysql.jdbc.StatementInterceptorV2;
public class MySQLStatementInterceptor implements StatementInterceptorV2
{
private ThreadLocal<Long> timeHolder = new ThreadLocal<Long>();
@Override
public void destroy()
{
}
@Override
public boolean executeTopLevelOnly()
{
return true;
}
@Override
public void init(Connection arg0, Properties arg1) throws SQLException
{
// System.out.println("init sql:" + arg0);
}
@Override
public ResultSetInternalMethods postProcess(String arg0, Statement arg1, ResultSetInternalMethods arg2,
Connection arg3, int arg4, boolean arg5, boolean arg6, SQLException arg7) throws SQLException
{
Long useTime = System.currentTimeMillis() - timeHolder.get();
String sql = getSql(arg1);
if (StringUtils.isNotEmpty(sql))
{
System.out.println("post sql:" + sql + "use time:" + useTime + "ms");
if (null != arg7)
{
System.out.println("catch exception " + arg7.getClass().getName() + ":" + arg7.getMessage());
}
}
return null;
}
@Override
public ResultSetInternalMethods preProcess(String arg0, Statement arg1, Connection arg2) throws SQLException
{
// String sql = getSql(arg1);
// if (StringUtils.isNotEmpty(sql))
// {
// System.out.println("pre sql:" + sql);
// }
timeHolder.set(System.currentTimeMillis());
return null;
}
private String getSql(Statement arg1)
{
String sql = null;
if (arg1 instanceof PreparedStatement)
{
try
{
sql = ((PreparedStatement)arg1).asSql();
}
catch (Exception e)
{
e.printStackTrace();
}
}
return sql;
}
}