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
{
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)
{

@ -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)
{

@ -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;

Loading…
Cancel
Save