From 8b440dd79c4630dd84fb3aaac7e339f256a6d0c0 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Thu, 16 Jan 2014 09:43:09 +0900 Subject: [PATCH] Track current transaction isolation level so that we can reset it only when necessary (as it often requires a round trip to the server). --- src/main/java/com/zaxxer/hikari/HikariPool.java | 13 ++++++------- .../com/zaxxer/hikari/proxy/ConnectionProxy.java | 8 +++++--- .../java/com/zaxxer/hikari/proxy/ProxyFactory.java | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/HikariPool.java b/src/main/java/com/zaxxer/hikari/HikariPool.java index f5d662a6..a867625b 100644 --- a/src/main/java/com/zaxxer/hikari/HikariPool.java +++ b/src/main/java/com/zaxxer/hikari/HikariPool.java @@ -325,20 +325,19 @@ public final class HikariPool implements HikariPoolMBean try { Connection connection = dataSource.getConnection(); - IHikariConnectionProxy proxyConnection = (IHikariConnectionProxy) ProxyFactory.getProxyConnection(this, connection); - + + connection.setAutoCommit(isAutoCommit); if (transactionIsolation < 0) { transactionIsolation = connection.getTransactionIsolation(); } - - boolean alive = isConnectionAlive(proxyConnection, configuration.getConnectionTimeout()); - if (!alive) + else { - // This will be caught below... - throw new RuntimeException("Connection not alive, retry."); + connection.setTransactionIsolation(transactionIsolation); } + IHikariConnectionProxy proxyConnection = (IHikariConnectionProxy) ProxyFactory.getProxyConnection(this, connection, transactionIsolation); + String initSql = configuration.getConnectionInitSql(); if (initSql != null && initSql.length() > 0) { diff --git a/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java b/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java index c4fe4a14..13d1b510 100644 --- a/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java +++ b/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java @@ -46,6 +46,7 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy private boolean isClosed; private boolean forceClose; private boolean isTransactionIsolationDirty; + private int currentIsolationLevel; private final long creationTime; private volatile long lastAccess; @@ -64,14 +65,14 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy SQL_ERRORS.add("01002"); // SQL92 disconnect error } - protected ConnectionProxy(HikariPool pool, Connection connection) + protected ConnectionProxy(HikariPool pool, Connection connection, int defaultIsolationLevel) { this.parentPool = pool; this.delegate = connection; + this.currentIsolationLevel = defaultIsolationLevel; creationTime = lastAccess = System.currentTimeMillis(); openStatements = new FastStatementList(); - isTransactionIsolationDirty = true; } public final void unregisterStatement(Object statement) @@ -418,7 +419,8 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy try { delegate.setTransactionIsolation(level); - isTransactionIsolationDirty = true; + isTransactionIsolationDirty |= (currentIsolationLevel == level); + currentIsolationLevel = level; } catch (SQLException e) { diff --git a/src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java b/src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java index ba20ab20..15d05564 100644 --- a/src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java +++ b/src/main/java/com/zaxxer/hikari/proxy/ProxyFactory.java @@ -31,7 +31,7 @@ import com.zaxxer.hikari.HikariPool; */ public final class ProxyFactory { - public static Connection getProxyConnection(HikariPool pool, Connection connection) + public static Connection getProxyConnection(HikariPool pool, Connection connection, int defaultIsolationLevel) { // Body is injected by JavassistProxyFactory return null;