Track current transaction isolation level so that we can reset it only when necessary (as it often requires a round trip to the server).

pull/30/head
Brett Wooldridge 11 years ago
parent 430dd730e7
commit 8b440dd79c

@ -325,20 +325,19 @@ public final class HikariPool implements HikariPoolMBean
try try
{ {
Connection connection = dataSource.getConnection(); Connection connection = dataSource.getConnection();
IHikariConnectionProxy proxyConnection = (IHikariConnectionProxy) ProxyFactory.getProxyConnection(this, connection);
connection.setAutoCommit(isAutoCommit);
if (transactionIsolation < 0) if (transactionIsolation < 0)
{ {
transactionIsolation = connection.getTransactionIsolation(); transactionIsolation = connection.getTransactionIsolation();
} }
else
boolean alive = isConnectionAlive(proxyConnection, configuration.getConnectionTimeout());
if (!alive)
{ {
// This will be caught below... connection.setTransactionIsolation(transactionIsolation);
throw new RuntimeException("Connection not alive, retry.");
} }
IHikariConnectionProxy proxyConnection = (IHikariConnectionProxy) ProxyFactory.getProxyConnection(this, connection, transactionIsolation);
String initSql = configuration.getConnectionInitSql(); String initSql = configuration.getConnectionInitSql();
if (initSql != null && initSql.length() > 0) if (initSql != null && initSql.length() > 0)
{ {

@ -46,6 +46,7 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy
private boolean isClosed; private boolean isClosed;
private boolean forceClose; private boolean forceClose;
private boolean isTransactionIsolationDirty; private boolean isTransactionIsolationDirty;
private int currentIsolationLevel;
private final long creationTime; private final long creationTime;
private volatile long lastAccess; private volatile long lastAccess;
@ -64,14 +65,14 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy
SQL_ERRORS.add("01002"); // SQL92 disconnect error 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.parentPool = pool;
this.delegate = connection; this.delegate = connection;
this.currentIsolationLevel = defaultIsolationLevel;
creationTime = lastAccess = System.currentTimeMillis(); creationTime = lastAccess = System.currentTimeMillis();
openStatements = new FastStatementList(); openStatements = new FastStatementList();
isTransactionIsolationDirty = true;
} }
public final void unregisterStatement(Object statement) public final void unregisterStatement(Object statement)
@ -418,7 +419,8 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy
try try
{ {
delegate.setTransactionIsolation(level); delegate.setTransactionIsolation(level);
isTransactionIsolationDirty = true; isTransactionIsolationDirty |= (currentIsolationLevel == level);
currentIsolationLevel = level;
} }
catch (SQLException e) catch (SQLException e)
{ {

@ -31,7 +31,7 @@ import com.zaxxer.hikari.HikariPool;
*/ */
public final class ProxyFactory 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 // Body is injected by JavassistProxyFactory
return null; return null;

Loading…
Cancel
Save