diff --git a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/driver/LoggingPreparedStatementInvocationHandler.java b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/driver/LoggingPreparedStatementInvocationHandler.java index 9c6cc13..3fe8188 100644 --- a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/driver/LoggingPreparedStatementInvocationHandler.java +++ b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/driver/LoggingPreparedStatementInvocationHandler.java @@ -18,6 +18,7 @@ import java.io.Serializable; import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLType; @@ -101,9 +102,10 @@ public Object invoke(final @Nullable Object proxy, final Method method, final Ob protected ResultSet internalExecutePreparedQuery(final Method method) throws Throwable { final UUID logId = UUID.randomUUID(); + final Connection connection = wrappedStatement.getConnection(); PerfLogger.logBeforePreparedStatement(connectionId, logId, rawSql, paramValues, StatementType.PREPARED_QUERY_STMT, databaseType, wrappedStatement.getQueryTimeout(), - wrappedStatement.getConnection().getAutoCommit()); + connection.getAutoCommit(), connection.getTransactionIsolation()); final long start = System.nanoTime(); Throwable exc = null; try { @@ -127,9 +129,10 @@ protected ResultSet internalExecutePreparedQuery(final Method method) throws Thr protected Object internalExecutePrepared(final Method method, final Object @Nullable [] args) throws Throwable { final UUID logId = UUID.randomUUID(); final long start = System.nanoTime(); + final Connection connection = wrappedStatement.getConnection(); PerfLogger.logBeforePreparedStatement(connectionId, logId, rawSql, paramValues, StatementType.BASE_PREPARED_STMT, databaseType, wrappedStatement.getQueryTimeout(), - wrappedStatement.getConnection().getAutoCommit()); + connection.getAutoCommit(), connection.getTransactionIsolation()); Throwable exc = null; Long updateCount = null; try { @@ -152,8 +155,9 @@ protected Object internalExecutePrepared(final Method method, final Object @Null @Nullable protected Object internalExecuteBatch(final Method method, final Object @Nullable [] args) throws Throwable { final UUID logId = UUID.randomUUID(); + final Connection connection = wrappedStatement.getConnection(); PerfLogger.logPreparedBatchedStatements(connectionId, logId, rawSql, batchedPreparedOrNonPreparedStmtExecutions, - databaseType, wrappedStatement.getQueryTimeout(), wrappedStatement.getConnection().getAutoCommit()); + databaseType, wrappedStatement.getQueryTimeout(), connection.getAutoCommit(), connection.getTransactionIsolation()); try { return internalExecuteBatchInternal(method, args, logId); } finally { diff --git a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/driver/LoggingStatementInvocationHandler.java b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/driver/LoggingStatementInvocationHandler.java index fa55d33..812382b 100644 --- a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/driver/LoggingStatementInvocationHandler.java +++ b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/driver/LoggingStatementInvocationHandler.java @@ -18,6 +18,7 @@ import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import java.sql.Connection; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; @@ -86,8 +87,9 @@ public Object invoke(final @Nullable Object _proxy, final Method method, final O protected final ResultSet internalExecuteQuery(final Method method, final Object[] args) throws Throwable { final UUID logId = UUID.randomUUID(); final long start = System.nanoTime(); + final Connection connection = wrappedStatement.getConnection(); PerfLogger.logBeforeStatement(connectionId, logId, (String) args[0], StatementType.NON_PREPARED_QUERY_STMT, - wrappedStatement.getQueryTimeout(), wrappedStatement.getConnection().getAutoCommit()); + wrappedStatement.getQueryTimeout(), connection.getAutoCommit(), connection.getTransactionIsolation()); Throwable exc = null; try { return getAndWrapResultSet(method, args, logId); @@ -114,8 +116,9 @@ private ResultSet getAndWrapResultSet(final Method method, final Object @Nullabl @Nullable protected final Object internalExecute(final Method method, final Object[] args) throws Throwable { final UUID logId = UUID.randomUUID(); + final Connection connection = wrappedStatement.getConnection(); PerfLogger.logBeforeStatement(connectionId, logId, (String) args[0], StatementType.BASE_NON_PREPARED_STMT, - wrappedStatement.getQueryTimeout(), wrappedStatement.getConnection().getAutoCommit()); + wrappedStatement.getQueryTimeout(), connection.getAutoCommit(), connection.getTransactionIsolation()); Throwable exc = null; Long updateCount = null; final long start = System.nanoTime(); @@ -138,8 +141,9 @@ protected final Object internalExecute(final Method method, final Object[] args) @Nullable protected Object internalExecuteBatch(final Method method, final Object @Nullable [] args) throws Throwable { final UUID logId = UUID.randomUUID(); + final Connection connection = wrappedStatement.getConnection(); PerfLogger.logNonPreparedBatchedStatements(connectionId, logId, batchedNonPreparedStmtExecutions, databaseType, - wrappedStatement.getQueryTimeout(), wrappedStatement.getConnection().getAutoCommit()); + wrappedStatement.getQueryTimeout(), connection.getAutoCommit(), connection.getTransactionIsolation()); try { return internalExecuteBatchInternal(method, args, logId); } finally { diff --git a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/logger/PerfLogger.java b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/logger/PerfLogger.java index 7b12816..6dcfd50 100644 --- a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/logger/PerfLogger.java +++ b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/logger/PerfLogger.java @@ -74,18 +74,18 @@ public class PerfLogger { } public static void logBeforeStatement(final UUID connectionId, final UUID logId, final String sql, - final StatementType statementType, final int timeout, final boolean autoCommit) { + final StatementType statementType, final int timeout, final boolean autoCommit, final int transactionIsolation) { if (LOGGER_ORIGINAL_SQL.isDebugEnabled()) { LOGGER_ORIGINAL_SQL.debug("Before execution of non-prepared stmt " + logId + ": " + sql); } final long now = System.currentTimeMillis(); PerfLoggerRemoting.postLog(new StatementLog(connectionId, logId, now, statementType, sql, - Thread.currentThread().getName(), timeout, autoCommit)); + Thread.currentThread().getName(), timeout, autoCommit, transactionIsolation)); } public static void logBeforePreparedStatement(final UUID connectionId, final UUID logId, final String rawSql, final PreparedStatementValuesHolder pstmtValues, final StatementType statementType, - final DatabaseType databaseType, final int timeout, final boolean autoCommit) { + final DatabaseType databaseType, final int timeout, final boolean autoCommit, final int transactionIsolation) { if (LOGGER_ORIGINAL_SQL.isDebugEnabled()) { LOGGER_ORIGINAL_SQL.debug("Before execution of prepared stmt " + logId + ": " + rawSql); } @@ -95,12 +95,12 @@ public static void logBeforePreparedStatement(final UUID connectionId, final UUI } final long now = System.currentTimeMillis(); PerfLoggerRemoting.postLog(new StatementLog(connectionId, logId, now, statementType, rawSql, filledSql, - Thread.currentThread().getName(), timeout, autoCommit)); + Thread.currentThread().getName(), timeout, autoCommit, transactionIsolation)); } public static void logNonPreparedBatchedStatements(final UUID connectionId, final UUID logId, final List batchedExecutions, final DatabaseType databaseType, final int timeout, - final boolean autoCommit) { + final boolean autoCommit, final int transactionIsolation) { final long now = System.currentTimeMillis(); if (LOGGER_ORIGINAL_SQL.isDebugEnabled()) { @@ -114,12 +114,12 @@ public static void logNonPreparedBatchedStatements(final UUID connectionId, fina } } PerfLoggerRemoting.postLog(new BatchedNonPreparedStatementsLog(connectionId, logId, now, batchedExecutions, - Thread.currentThread().getName(), timeout, autoCommit)); + Thread.currentThread().getName(), timeout, autoCommit, transactionIsolation)); } public static void logPreparedBatchedStatements(final UUID connectionId, final UUID logId, final String rawSql, final List batchedExecutions, final DatabaseType databaseType, final int timeout, - final boolean autoCommit) { + final boolean autoCommit, final int transactionIsolation) { final long now = System.currentTimeMillis(); if (LOGGER_ORIGINAL_SQL.isDebugEnabled()) { LOGGER_ORIGINAL_SQL.debug("Before execution of " + batchedExecutions.size() @@ -141,7 +141,7 @@ public static void logPreparedBatchedStatements(final UUID connectionId, final U } } PerfLoggerRemoting.postLog(new BatchedPreparedStatementsLog(connectionId, logId, now, rawSql, filledSqlList, - Thread.currentThread().getName(), timeout, autoCommit)); + Thread.currentThread().getName(), timeout, autoCommit, transactionIsolation)); } public static void logStatementExecuted(final UUID logId, final long durationNanos, diff --git a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/AbstractBeforeStatementExecutionLog.java b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/AbstractBeforeStatementExecutionLog.java index 085aa1f..bc21788 100644 --- a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/AbstractBeforeStatementExecutionLog.java +++ b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/AbstractBeforeStatementExecutionLog.java @@ -30,9 +30,10 @@ public class AbstractBeforeStatementExecutionLog implements LogMessage { private final String threadName; private final int timeout; private final boolean autoCommit; + private final int transactionIsolation; public AbstractBeforeStatementExecutionLog(final UUID connectionId, final UUID logId, final long timestamp, - final StatementType statementType, final String threadName, final int timeout, final boolean autoCommit) { + final StatementType statementType, final String threadName, final int timeout, final boolean autoCommit, int transactionIsolation) { connectionUuid = connectionId; this.logId = logId; this.timestamp = timestamp; @@ -40,6 +41,7 @@ public AbstractBeforeStatementExecutionLog(final UUID connectionId, final UUID l this.threadName = threadName; this.timeout = timeout; this.autoCommit = autoCommit; + this.transactionIsolation = transactionIsolation; } public UUID getConnectionUuid() { @@ -70,4 +72,7 @@ public boolean isAutoCommit() { return autoCommit; } + public int getTransactionIsolation() { + return transactionIsolation; + } } \ No newline at end of file diff --git a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/BatchedNonPreparedStatementsLog.java b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/BatchedNonPreparedStatementsLog.java index 296cc98..fcdf5c3 100644 --- a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/BatchedNonPreparedStatementsLog.java +++ b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/BatchedNonPreparedStatementsLog.java @@ -29,9 +29,10 @@ public class BatchedNonPreparedStatementsLog extends AbstractBeforeStatementExec private final List sqlList; public BatchedNonPreparedStatementsLog(final UUID connectionId, final UUID logId, final long timestamp, - final List sqlList, final String threadName, final int timeout, final boolean autoCommit) { + final List sqlList, final String threadName, final int timeout, final boolean autoCommit, + final int transactionIsolation) { super(connectionId, logId, timestamp, StatementType.NON_PREPARED_BATCH_EXECUTION, threadName, timeout, - autoCommit); + autoCommit, transactionIsolation); this.sqlList = Collections.unmodifiableList(new ArrayList(sqlList)); } @@ -48,6 +49,7 @@ public String toString() { + ", threadName=" + getThreadName()// + ", timeout=" + getTimeout()// + ", autocommit=" + isAutoCommit()// + + ", getTransactionIsolation=" + getTransactionIsolation()// + ", sqlList=" + sqlList// + "]"; } diff --git a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/BatchedPreparedStatementsLog.java b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/BatchedPreparedStatementsLog.java index 907a28e..f135dee 100644 --- a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/BatchedPreparedStatementsLog.java +++ b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/BatchedPreparedStatementsLog.java @@ -31,8 +31,8 @@ public class BatchedPreparedStatementsLog extends AbstractBeforeStatementExecuti public BatchedPreparedStatementsLog(final UUID connectionId, final UUID logId, final long timestamp, final String rawSql, final List sqlList, final String threadName, final int timeout, - final boolean autoCommit) { - super(connectionId, logId, timestamp, StatementType.PREPARED_BATCH_EXECUTION, threadName, timeout, autoCommit); + final boolean autoCommit, final int transactionIsolation) { + super(connectionId, logId, timestamp, StatementType.PREPARED_BATCH_EXECUTION, threadName, timeout, autoCommit, transactionIsolation); this.rawSql = rawSql; this.sqlList = Collections.unmodifiableList(new ArrayList(sqlList)); } @@ -55,6 +55,7 @@ public String toString() { + ", threadName=" + getThreadName()// + ", timeout=" + getTimeout()// + ", autocommit=" + isAutoCommit()// + + ", transactionIsolation=" + getTransactionIsolation()// + "]"; } diff --git a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/StatementLog.java b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/StatementLog.java index f686aff..49dc89a 100644 --- a/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/StatementLog.java +++ b/jdbc-perf-logger-driver/src/main/java/ch/sla/jdbcperflogger/model/StatementLog.java @@ -29,8 +29,8 @@ public class StatementLog extends AbstractBeforeStatementExecutionLog { public StatementLog(final UUID connectionId, final UUID logId, final long timestamp, final StatementType statementType, final String sql, final String threadName, final int timeout, - final boolean autoCommit) { - super(connectionId, logId, timestamp, statementType, threadName, timeout, autoCommit); + final boolean autoCommit, final int transactionIsolation) { + super(connectionId, logId, timestamp, statementType, threadName, timeout, autoCommit, transactionIsolation); rawSql = sql; filledSql = sql; preparedStatement = false; @@ -38,8 +38,8 @@ public StatementLog(final UUID connectionId, final UUID logId, final long timest public StatementLog(final UUID connectionId, final UUID logId, final long timestamp, final StatementType statementType, final String rawSql, final String filledSql, final String threadName, - final int timeout, final boolean autoCommit) { - super(connectionId, logId, timestamp, statementType, threadName, timeout, autoCommit); + final int timeout, final boolean autoCommit, int transactionIsolation) { + super(connectionId, logId, timestamp, statementType, threadName, timeout, autoCommit, transactionIsolation); this.rawSql = rawSql; this.filledSql = filledSql; preparedStatement = true; @@ -66,6 +66,7 @@ public String toString() { + ", threadName=" + getThreadName()// + ", timeout=" + getTimeout()// + ", autocommit=" + isAutoCommit()// + + ", getTransactionIsolation=" + getTransactionIsolation()// + ", rawSql=" + rawSql// + ", filledSql=" + filledSql// + ", preparedStatement=" + preparedStatement// diff --git a/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryConstants.java b/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryConstants.java index 332b806..07934db 100644 --- a/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryConstants.java +++ b/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryConstants.java @@ -11,17 +11,18 @@ public class LogRepositoryConstants { public static final String EXEC_PLUS_RSET_USAGE_TIME = "EXEC_PLUS_RSET_USAGE_TIME"; public static final String EXEC_TIME_COLUMN = "execution_time"; public static final String FETCH_TIME_COLUMN = "fetch_time"; - public static final String RSET_USAGE_TIME = "RSET_USAGE_TIME"; public static final String FILLED_SQL_COLUMN = "FILLEDSQL"; public static final String ID_COLUMN = "ID"; public static final String MAX_EXEC_PLUS_RSET_USAGE_TIME_COLUMN = "MAX_EXEC_PLUS_RSET_USAGE_TIME"; public static final String MIN_EXEC_PLUS_RSET_USAGE_TIME_COLUMN = "MIN_EXEC_PLUS_RSET_USAGE_TIME"; public static final String NB_ROWS_COLUMN = "NBROWS"; public static final String RAW_SQL_COLUMN = "RAWSQL"; + public static final String RSET_USAGE_TIME = "RSET_USAGE_TIME"; public static final String STMT_TYPE_COLUMN = "STATEMENTTYPE"; public static final String THREAD_NAME_COLUMN = "threadName"; public static final String TIMEOUT_COLUMN = "TIMEOUT"; public static final String TOTAL_EXEC_PLUS_RSET_USAGE_TIME_COLUMN = "TOTAL_EXEC_PLUS_RSET_USAGE_TIME"; + public static final String TRANSACTION_ISOLATION_COLUMN = "TRANSACTION_ISOLATION"; public static final String TSTAMP_COLUMN = "TSTAMP"; } diff --git a/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryReadJdbc.java b/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryReadJdbc.java index 101d005..20eaaff 100644 --- a/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryReadJdbc.java +++ b/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryReadJdbc.java @@ -65,7 +65,7 @@ public void getStatements(final LogSearchCriteria searchCriteria, final ResultSe final boolean withFilledSql) { final StringBuilder sql = new StringBuilder("select id, tstamp, statementType, rawSql, " // + "exec_plus_rset_usage_time, execution_time, rset_usage_time, fetch_time, "// - + "nbRows, threadName, connectionNumber, timeout, autoCommit, error "); + + "nbRows, threadName, connectionNumber, timeout, autoCommit, transaction_Isolation, error "); if (withFilledSql) { sql.append(", " + LogRepositoryConstants.FILLED_SQL_COLUMN); } diff --git a/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryUpdateJdbc.java b/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryUpdateJdbc.java index 5e2e6c5..3f5d1dc 100644 --- a/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryUpdateJdbc.java +++ b/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/db/LogRepositoryUpdateJdbc.java @@ -78,13 +78,13 @@ public LogRepositoryUpdateJdbc(final String name) { addStatementLog = connectionUpdate .prepareStatement("insert into statement_log (logId, tstamp, statementType, rawSql, filledSql, " // - + "threadName, connectionId, timeout, autoCommit)"// - + " values(?, ?, ?, ?, ?, ?, ?, ?, ?)"); + + "threadName, connectionId, timeout, autoCommit, transaction_Isolation)"// + + " values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); addStatementLogWithAfterExecutionInfo = connectionUpdate .prepareStatement("insert into statement_log (logId, tstamp, statementType, rawSql, filledSql, " // - + "threadName, connectionId, timeout, autoCommit, executionDurationNanos, nbRows, " // + + "threadName, connectionId, timeout, autoCommit, transaction_Isolation, executionDurationNanos, nbRows, " // + "fetchDurationNanos, rsetUsageDurationNanos, exception)"// - + " values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + + " values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); updateStatementLogWithResultSet = connectionUpdate.prepareStatement( "update statement_log set fetchDurationNanos=?, rsetUsageDurationNanos=?, nbRows=? where logId=?"); updateStatementLogAfterExecution = connectionUpdate.prepareStatement( @@ -183,6 +183,7 @@ public synchronized void addStatementLog(final StatementLog log) { addStatementLog.setObject(i++, log.getConnectionUuid()); addStatementLog.setInt(i++, log.getTimeout()); addStatementLog.setBoolean(i++, log.isAutoCommit()); + addStatementLog.setInt(i++, log.getTransactionIsolation()); final int insertCount = addStatementLog.executeUpdate(); assert insertCount == 1; } catch (final SQLException e) { @@ -206,6 +207,7 @@ public synchronized void addStatementFullyExecutedLog(final Collection toDescription = text -> text + " (" + transactionIsolation + ")"; + switch (transactionIsolation) { + case TRANSACTION_READ_UNCOMMITTED: + component.setText("RU"); + component.setToolTipText(toDescription.apply("Read Uncommitted")); + break; + case TRANSACTION_READ_COMMITTED: + component.setText("RC"); + component.setToolTipText(toDescription.apply("Read Committed")); + break; + case TRANSACTION_REPEATABLE_READ: + component.setText("RR"); + component.setToolTipText(toDescription.apply("Repeatable Read")); + break; + case TRANSACTION_SERIALIZABLE: + component.setText("SE"); + component.setToolTipText(toDescription.apply("Serializable")); + break; + } + } } else if (value != null) { component.setToolTipText(value.toString()); @@ -83,4 +111,5 @@ public Component getTableCellRendererComponent(@Nullable final JTable table, @Nu return component; } + } diff --git a/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/ui/PerfLoggerController.java b/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/ui/PerfLoggerController.java index 0e47958..99ded1c 100644 --- a/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/ui/PerfLoggerController.java +++ b/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/ui/PerfLoggerController.java @@ -31,16 +31,12 @@ import javax.swing.SwingUtilities; import javax.swing.filechooser.FileNameExtensionFilter; +import ch.sla.jdbcperflogger.console.db.*; import org.eclipse.jdt.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.sla.jdbcperflogger.StatementType; -import ch.sla.jdbcperflogger.console.db.DetailedViewStatementLog; -import ch.sla.jdbcperflogger.console.db.LogRepositoryRead; -import ch.sla.jdbcperflogger.console.db.LogRepositoryUpdate; -import ch.sla.jdbcperflogger.console.db.LogSearchCriteria; -import ch.sla.jdbcperflogger.console.db.ResultSetAnalyzer; import ch.sla.jdbcperflogger.console.net.AbstractLogReceiver; import ch.sla.jdbcperflogger.model.ConnectionInfo; @@ -495,8 +491,13 @@ void doRefreshData(final SelectLogRunner selectLogRunner) { final List tempRows = new ArrayList<>(); try { for (int i = 1; i <= columnCount; i++) { - tempColumnNames.add(resultSetMetaData.getColumnLabel(i).toUpperCase()); - tempColumnTypes.add(Class.forName(resultSetMetaData.getColumnClassName(i))); + String columnLabel = resultSetMetaData.getColumnLabel(i); + tempColumnNames.add(columnLabel.toUpperCase()); + if (LogRepositoryConstants.TRANSACTION_ISOLATION_COLUMN.equals(columnLabel)) { + tempColumnTypes.add(String.class); + } else { + tempColumnTypes.add(Class.forName(resultSetMetaData.getColumnClassName(i))); + } } while (resultSet.next()) { diff --git a/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/ui/PerfLoggerPanel.java b/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/ui/PerfLoggerPanel.java index 3d3937e..ef0d196 100644 --- a/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/ui/PerfLoggerPanel.java +++ b/jdbc-perf-logger-gui/src/main/java/ch/sla/jdbcperflogger/console/ui/PerfLoggerPanel.java @@ -94,6 +94,7 @@ public class PerfLoggerPanel extends JPanel { COLUMNS_WIDTH.put(LogRepositoryConstants.TOTAL_EXEC_PLUS_RSET_USAGE_TIME_COLUMN, 100); COLUMNS_WIDTH.put(LogRepositoryConstants.TIMEOUT_COLUMN, 70); COLUMNS_WIDTH.put(LogRepositoryConstants.AUTOCOMMIT_COLUMN, 40); + COLUMNS_WIDTH.put(LogRepositoryConstants.TRANSACTION_ISOLATION_COLUMN, 50); COLUMNS_WIDTH.put(LogRepositoryConstants.ERROR_COLUMN, 0); } diff --git a/jdbc-perf-logger-gui/src/main/resources/initdb.sql b/jdbc-perf-logger-gui/src/main/resources/initdb.sql index 044f2e9..cea5730 100644 --- a/jdbc-perf-logger-gui/src/main/resources/initdb.sql +++ b/jdbc-perf-logger-gui/src/main/resources/initdb.sql @@ -13,7 +13,7 @@ create table if not exists statement_log (id identity, connectionId UUID not null, logId UUID not null, tstamp timestamp not null, statementType tinyInt not null, rawSql varchar not null, filledSql varchar not null, executionDurationNanos bigInt, fetchDurationNanos bigInt, rsetUsageDurationNanos bigInt, nbRows int, - threadName varchar, exception varchar, timeout int, autoCommit boolean); + threadName varchar, exception varchar, timeout int, autoCommit boolean, transaction_Isolation int); create index if not exists idx_logId on statement_log(logId); create index if not exists idx_duration on statement_log(executionDurationNanos desc); @@ -27,7 +27,7 @@ create table if not exists batched_statement_log create index if not exists idx_batched_logId on batched_statement_log(logId); create or replace view v_statement_log - (id, tstamp, statementType, rawSql, filledSql, EXEC_PLUS_RSET_USAGE_TIME, execution_time, fetch_time, RSET_USAGE_TIME, nbRows, threadName, timeout, autoCommit, error, connectionNumber) + (id, tstamp, statementType, rawSql, filledSql, EXEC_PLUS_RSET_USAGE_TIME, execution_time, fetch_time, RSET_USAGE_TIME, nbRows, threadName, timeout, autoCommit, transaction_Isolation, error, connectionNumber) as select statement_log.id, statement_log.tstamp, statement_log.statementType, statement_log.rawSql, statement_log.filledSql, statement_log.executionDurationNanos+coalesce(statement_log.rsetUsageDurationNanos,0) as EXEC_PLUS_RSET_USAGE_TIME, statement_log.executionDurationNanos as execution_time, @@ -37,6 +37,7 @@ create or replace view v_statement_log statement_log.threadName, case when statement_log.timeout = 0 then null else statement_log.timeout end as timeout, case when statement_log.autoCommit then 'Y' else null end as autoCommit, + statement_log.transaction_Isolation, NVL2(statement_log.exception, 1, null) as exception, connection_info.connectionNumber from statement_log join connection_info on (connection_info.connectionId=statement_log.connectionId); diff --git a/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/AbstractLogRepositoryTest.java b/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/AbstractLogRepositoryTest.java index 15847f0..4733a63 100644 --- a/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/AbstractLogRepositoryTest.java +++ b/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/AbstractLogRepositoryTest.java @@ -1,9 +1,11 @@ package ch.sla.jdbcperflogger.console.db; +import static java.sql.Connection.TRANSACTION_NONE; import static java.util.UUID.randomUUID; import static org.eclipse.jdt.annotation.DefaultLocation.PARAMETER; import static org.eclipse.jdt.annotation.DefaultLocation.RETURN_TYPE; +import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -48,7 +50,7 @@ protected ConnectionInfo insert1Connection() { protected StatementLog insert1Log(final ConnectionInfo connectionInfo) { final StatementLog log = new StatementLog(connectionInfo.getUuid(), randomUUID(), System.currentTimeMillis(), - StatementType.BASE_NON_PREPARED_STMT, "myrawsql", Thread.currentThread().getName(), 123, true); + StatementType.BASE_NON_PREPARED_STMT, "myrawsql", Thread.currentThread().getName(), 123, true, TRANSACTION_NONE); repositoryUpdate.addStatementLog(log); return log; } diff --git a/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/LogRepositoryReadJdbcTest.java b/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/LogRepositoryReadJdbcTest.java index 2ff1d06..899dcc4 100644 --- a/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/LogRepositoryReadJdbcTest.java +++ b/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/LogRepositoryReadJdbcTest.java @@ -1,11 +1,13 @@ package ch.sla.jdbcperflogger.console.db; import static ch.sla.jdbcperflogger.console.db.LogRepositoryConstants.ID_COLUMN; +import static java.sql.Connection.TRANSACTION_READ_UNCOMMITTED; import static java.util.UUID.randomUUID; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import java.sql.Connection; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -344,7 +346,7 @@ public void testaddBatchedPreparedStatementsLog() { final List sqlList = Arrays.asList("st1", "st2", "st3"); final BatchedPreparedStatementsLog batchedLogs = new BatchedPreparedStatementsLog(log.getConnectionUuid(), - randomUUID(), System.currentTimeMillis(), "myRaw stmt", sqlList, "myThread", 13, true); + randomUUID(), System.currentTimeMillis(), "myRaw stmt", sqlList, "myThread", 13, true, 1); repositoryUpdate.addBatchedPreparedStatementsLog(batchedLogs); assertEquals(2, countRowsInTable("statement_log")); assertEquals(3, countRowsInTable("batched_statement_log")); @@ -385,7 +387,7 @@ private List insert3Logs() { { final StatementLog log = new StatementLog(connectionInfo.getUuid(), randomUUID(), System.currentTimeMillis(), StatementType.BASE_NON_PREPARED_STMT, "myrawsql", "myfilledsql", - Thread.currentThread().getName(), 123, true); + Thread.currentThread().getName(), 123, true, TRANSACTION_READ_UNCOMMITTED); final StatementExecutedLog statementExecutedLog = new StatementExecutedLog(log.getLogId(), 234L, 4560L, "myexception"); fullLogs.add(new StatementFullyExecutedLog(log, statementExecutedLog, null)); @@ -393,7 +395,7 @@ private List insert3Logs() { { final StatementLog log = new StatementLog(connectionInfo.getUuid(), randomUUID(), System.currentTimeMillis(), StatementType.BASE_NON_PREPARED_STMT, "myrawsql", "myfilledsql", - Thread.currentThread().getName(), 123, true); + Thread.currentThread().getName(), 123, true, TRANSACTION_READ_UNCOMMITTED); final StatementExecutedLog statementExecutedLog = new StatementExecutedLog(log.getLogId(), 2340L, 456L, "myexception"); final ResultSetLog resultSetLog = new ResultSetLog(log.getLogId(), 789L, 700L, 21); @@ -402,7 +404,7 @@ private List insert3Logs() { { final StatementLog log = new StatementLog(connectionInfo.getUuid(), randomUUID(), System.currentTimeMillis(), StatementType.BASE_NON_PREPARED_STMT, "myRawsql2", "myfilledsql2", - Thread.currentThread().getName(), 0, true); + Thread.currentThread().getName(), 0, true, TRANSACTION_READ_UNCOMMITTED); @SuppressWarnings("null") final StatementExecutedLog statementExecutedLog = new StatementExecutedLog(log.getLogId(), 12L, null, null); fullLogs.add(new StatementFullyExecutedLog(log, statementExecutedLog, null)); diff --git a/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/LogRepositoryUpdateJdbcTest.java b/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/LogRepositoryUpdateJdbcTest.java index 0486725..98e6808 100644 --- a/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/LogRepositoryUpdateJdbcTest.java +++ b/jdbc-perf-logger-gui/src/test/java/ch/sla/jdbcperflogger/console/db/LogRepositoryUpdateJdbcTest.java @@ -16,6 +16,7 @@ package ch.sla.jdbcperflogger.console.db; import static ch.sla.jdbcperflogger.console.db.LogRepositoryConstants.ID_COLUMN; +import static ch.sla.jdbcperflogger.console.db.LogRepositoryConstants.TRANSACTION_ISOLATION_COLUMN; import static java.util.UUID.randomUUID; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -91,6 +92,7 @@ public void testUpdateResultSetAfterInsert() { assertEquals(1, resultSet.getLong(ID_COLUMN)); assertEquals(stmtLog.getRawSql(), resultSet.getString(LogRepositoryConstants.RAW_SQL_COLUMN)); assertEquals(stmtLog.isAutoCommit(), resultSet.getBoolean(LogRepositoryConstants.AUTOCOMMIT_COLUMN)); + assertEquals(stmtLog.getTransactionIsolation(), resultSet.getInt(TRANSACTION_ISOLATION_COLUMN)); assertEquals(12, resultSet.getInt(LogRepositoryConstants.CONNECTION_NUMBER_COLUMN)); assertEquals(resultSetLog.getResultSetUsageDurationNanos(), resultSet.getInt(LogRepositoryConstants.RSET_USAGE_TIME)); @@ -129,7 +131,7 @@ public void testDeleteOldRowsIfTooMany() { for (int i = 1; i < 2 * LogRepositoryUpdateJdbc.NB_ROWS_MAX; i++) { final StatementLog newLog = new StatementLog(log.getConnectionUuid(), randomUUID(), System.currentTimeMillis(), StatementType.BASE_NON_PREPARED_STMT, "myrawsql" + i, - Thread.currentThread().getName(), i, i % 2 == 0); + Thread.currentThread().getName(), i, i % 2 == 0, i % 4); repositoryUpdate.addStatementLog(newLog); } assertNotNull(repositoryUpdate.getLastLostMessageTime()); @@ -152,11 +154,11 @@ public void testClear() { public void testDelete() { final StatementLog log1 = insert1Log(); final StatementLog log2 = new StatementLog(log1.getConnectionUuid(), randomUUID(), System.currentTimeMillis(), - StatementType.BASE_NON_PREPARED_STMT, "myrawsql2", Thread.currentThread().getName(), 2, false); + StatementType.BASE_NON_PREPARED_STMT, "myrawsql2", Thread.currentThread().getName(), 2, false, 1); repositoryUpdate.addStatementLog(log2); final StatementLog log3 = new StatementLog(log1.getConnectionUuid(), randomUUID(), System.currentTimeMillis(), - StatementType.BASE_NON_PREPARED_STMT, "myrawsql3", Thread.currentThread().getName(), 3, false); + StatementType.BASE_NON_PREPARED_STMT, "myrawsql3", Thread.currentThread().getName(), 3, false, 1); repositoryUpdate.addStatementLog(log3); assertEquals(3, countRowsInTable("statement_log")); @@ -170,7 +172,7 @@ public void testaddBatchedNonPreparedStatementsLog() { final List sqlList = Arrays.asList("st1", "st2", "st3"); final BatchedNonPreparedStatementsLog batchedLogs = new BatchedNonPreparedStatementsLog(log.getConnectionUuid(), - randomUUID(), System.currentTimeMillis(), sqlList, "myThread", 13, true); + randomUUID(), System.currentTimeMillis(), sqlList, "myThread", 13, true, 1); repositoryUpdate.addBatchedNonPreparedStatementsLog(batchedLogs); assertEquals(2, countRowsInTable("statement_log")); assertEquals(3, countRowsInTable("batched_statement_log")); @@ -182,7 +184,7 @@ public void testaddBatchedPreparedStatementsLog() { final List sqlList = Arrays.asList("st1", "st2", "st3"); final BatchedPreparedStatementsLog batchedLogs = new BatchedPreparedStatementsLog(log.getConnectionUuid(), - randomUUID(), System.currentTimeMillis(), "myRaw stmt", sqlList, "myThread", 13, true); + randomUUID(), System.currentTimeMillis(), "myRaw stmt", sqlList, "myThread", 13, true, 1); repositoryUpdate.addBatchedPreparedStatementsLog(batchedLogs); assertEquals(2, countRowsInTable("statement_log")); assertEquals(3, countRowsInTable("batched_statement_log")); @@ -198,6 +200,8 @@ public void testaddBatchedPreparedStatementsLog() { assertEquals(batchedLogs.getRawSql(), resultSet.getString(LogRepositoryConstants.RAW_SQL_COLUMN)); assertEquals(batchedLogs.isAutoCommit(), resultSet.getBoolean(LogRepositoryConstants.AUTOCOMMIT_COLUMN)); + assertEquals(batchedLogs.getTransactionIsolation(), + resultSet.getInt(TRANSACTION_ISOLATION_COLUMN)); assertEquals(0, resultSet.getInt(LogRepositoryConstants.FETCH_TIME_COLUMN)); assertEquals(0, resultSet.getInt(LogRepositoryConstants.RSET_USAGE_TIME)); assertEquals(statementExecutedLog.getExecutionTimeNanos(), @@ -255,7 +259,7 @@ public void testaddStatementFullyExecutedLog() { { final StatementLog log = new StatementLog(connectionInfo.getUuid(), randomUUID(), System.currentTimeMillis(), StatementType.BASE_NON_PREPARED_STMT, "myrawsql", - Thread.currentThread().getName(), 123, true); + Thread.currentThread().getName(), 123, true, 1); final StatementExecutedLog statementExecutedLog = new StatementExecutedLog(log.getLogId(), 234L, 456L, "myexception"); fullLogs.add(new StatementFullyExecutedLog(log, statementExecutedLog, null)); @@ -263,7 +267,7 @@ public void testaddStatementFullyExecutedLog() { { final StatementLog log = new StatementLog(connectionInfo.getUuid(), randomUUID(), System.currentTimeMillis(), StatementType.BASE_NON_PREPARED_STMT, "myrawsql", - Thread.currentThread().getName(), 123, true); + Thread.currentThread().getName(), 123, true, 1); final StatementExecutedLog statementExecutedLog = new StatementExecutedLog(log.getLogId(), 234L, 456L, "myexception"); final ResultSetLog resultSetLog = new ResultSetLog(log.getLogId(), 789L, 700L, 21); @@ -282,6 +286,8 @@ public void testaddStatementFullyExecutedLog() { assertEquals(stmtLog.getRawSql(), resultSet.getString(LogRepositoryConstants.RAW_SQL_COLUMN)); assertEquals(stmtLog.isAutoCommit(), resultSet.getBoolean(LogRepositoryConstants.AUTOCOMMIT_COLUMN)); + assertEquals(stmtLog.getTransactionIsolation(), + resultSet.getInt(TRANSACTION_ISOLATION_COLUMN)); assertEquals(12, resultSet.getInt(LogRepositoryConstants.CONNECTION_NUMBER_COLUMN)); resultSet.getLong(LogRepositoryConstants.RSET_USAGE_TIME); @@ -313,6 +319,8 @@ public void testaddStatementFullyExecutedLog() { assertEquals(stmtLog.getRawSql(), resultSet.getString(LogRepositoryConstants.RAW_SQL_COLUMN)); assertEquals(stmtLog.isAutoCommit(), resultSet.getBoolean(LogRepositoryConstants.AUTOCOMMIT_COLUMN)); + assertEquals(stmtLog.getTransactionIsolation(), + resultSet.getInt(TRANSACTION_ISOLATION_COLUMN)); assertEquals(12, resultSet.getInt(LogRepositoryConstants.CONNECTION_NUMBER_COLUMN)); assertEquals(stmtLog.getResultSetUsageDurationNanos().longValue(), resultSet.getLong(LogRepositoryConstants.RSET_USAGE_TIME));