@Slf4j public class InspectSqlStackFilter extends FilterEventAdapter { private final Set<string> firstStacks = new ConcurrentHashSet(); @Override public boolean statement_execute(FilterChain chain, StatementProxy statement, String sql) throws SQLException { try { long startTime = System.currentTimeMillis(); boolean result = super.statement_execute(chain, statement, sql); doLogAsExecute(chain, statement, sql, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public boolean statement_execute(FilterChain chain, StatementProxy statement, String sql, int autoGeneratedKeys) throws SQLException { try { long startTime = System.currentTimeMillis(); boolean result = super.statement_execute(chain, statement, sql, autoGeneratedKeys); doLogAsExecute(chain, statement, sql, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public boolean statement_execute(FilterChain chain, StatementProxy statement, String sql, int[] columnIndexes) throws SQLException { try { long startTime = System.currentTimeMillis(); boolean result = super.statement_execute(chain, statement, sql, columnIndexes); doLogAsExecute(chain, statement, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public boolean statement_execute(FilterChain chain, StatementProxy statement, String sql, String[] columnNames) throws SQLException { try { long startTime = System.currentTimeMillis(); boolean result = super.statement_execute(chain, statement, sql, columnNames); doLogAsExecute(chain, statement, sql, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public int[] statement_executeBatch(FilterChain chain, StatementProxy statement) throws SQLException { try { long startTime = System.currentTimeMillis(); int[] result = super.statement_executeBatch(chain, statement); doLogAsExecute(chain, statement, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public ResultSetProxy statement_executeQuery(FilterChain chain, StatementProxy statement, String sql) throws SQLException { try { long startTime = System.currentTimeMillis(); ResultSetProxy result = super.statement_executeQuery(chain, statement, sql); doLogAsExecute(chain, statement, sql, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public int statement_executeUpdate(FilterChain chain, StatementProxy statement, String sql) throws SQLException { try { long startTime = System.currentTimeMillis(); int result = super.statement_executeUpdate(chain, statement, sql); doLogAsExecute(chain, statement, sql, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public int statement_executeUpdate(FilterChain chain, StatementProxy statement, String sql, int autoGeneratedKeys) throws SQLException { try { long startTime = System.currentTimeMillis(); int result = super.statement_executeUpdate(chain, statement, sql, autoGeneratedKeys); doLogAsExecute(chain, statement, sql, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public int statement_executeUpdate(FilterChain chain, StatementProxy statement, String sql, int[] columnIndexes) throws SQLException { try { long startTime = System.currentTimeMillis(); int result = super.statement_executeUpdate(chain, statement, sql, columnIndexes); doLogAsExecute(chain, statement, sql, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public int statement_executeUpdate(FilterChain chain, StatementProxy statement, String sql, String[] columnNames) throws SQLException { try { long startTime = System.currentTimeMillis(); int result = super.statement_executeUpdate(chain, statement, sql, columnNames); doLogAsExecute(chain, statement, sql, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public boolean preparedStatement_execute(FilterChain chain, PreparedStatementProxy statement) throws SQLException { try { long startTime = System.currentTimeMillis(); boolean result = super.preparedStatement_execute(chain, statement); doLogAsExecute(chain, statement, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public ResultSetProxy preparedStatement_executeQuery(FilterChain chain, PreparedStatementProxy statement) throws SQLException { try { long startTime = System.currentTimeMillis(); ResultSetProxy result = super.preparedStatement_executeQuery(chain, statement); doLogAsExecute(chain, statement, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } @Override public int preparedStatement_executeUpdate(FilterChain chain, PreparedStatementProxy statement) throws SQLException { try { long startTime = System.currentTimeMillis(); int result = super.preparedStatement_executeUpdate(chain, statement); doLogAsExecute(chain, statement, System.currentTimeMillis() - startTime); return result; } catch (SQLException ex) { throw unwrapException(ex, chain, statement); } } private SQLException unwrapException(SQLException ex, FilterChain chain, StatementProxy statement){ String message = String.format("nurl -> %snsql -> %snerros->%s", chain.getDataSource().getUrl(), statement.getLastExecuteSql(), ex.getMessage()); if (ex instanceof CommunicationsException) { Throwable cause = ex.getCause(); if (cause instanceof SocketTimeoutException) { return new SQLException(message, cause); } else if (cause instanceof CJCommunicationsException) { if (cause.getCause() instanceof SocketTimeoutException) { return new SQLException(message, cause.getCause()); } } } return new SQLException(message, ex.getCause()); } private void doLogAsExecute(FilterChain chain, StatementProxy statement, long duration) { this.doLogAsExecute(chain, statement, null, duration); } public static void main(String[] args) { } private void doLogAsExecute(FilterChain chain, StatementProxy statement, String sql, long duration) { String applicationName = SpringContextHolder.getApplicationName(); if (duration lines = new LinkedList(); LinkedList<string> stacks = new LinkedList(); String firstStack = null; StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace(); for (int i = 15; i parameters = statement.getParameters(); if (!parameters.isEmpty()) { Map<integer object> hashMap = new HashMap(); for (Map.Entry<integer jdbcparameter> entry : parameters.entrySet()) { hashMap.put(entry.getKey(), entry.getValue().getValue()); } lines.addFirst("parameters: " + hashMap); } if (sql != null) { sql = SQLUtils.format(sql, DbType.mysql); lines.addFirst("sql: " + sql); SpringContextHolder.publishEvent(new InspectSqlEvent(sql.replaceAll("\s+", " "), stacks)); } lines.addFirst("url: " + chain.getDataSource().getUrl()); lines.addFirst("duration: " + duration + "ms"); lines.addLast("nn-----------------------dividing---------------------nn"); File file = new File("sql_trace_info.txt"); FileUtils.writeLines(file, "UTF-8", lines, true); } catch (IOException ignore) { } } } } </integer></integer></string></string>
以上就是SQL 耗时跟踪的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系 yyfuon@163.com