diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 5801f61968..c9919345ec 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -257,16 +257,14 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } Connection realConnection = poolalbeConnection.getConnection(); - JdbcUtils.close(realConnection); - this.decrementActiveCountWithLock(); + discardConnection(realConnection); continue; } poolalbeConnection.getConnectionHolder().setLastCheckTimeMillis(System.currentTimeMillis()); } else { Connection realConnection = poolalbeConnection.getConnection(); if (realConnection.isClosed()) { - JdbcUtils.close(realConnection); - this.decrementActiveCountWithLock(); + discardConnection(realConnection); continue; } @@ -280,8 +278,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat LOG.debug("skip not validate connection."); } - JdbcUtils.close(realConnection); - this.decrementActiveCountWithLock(); + discardConnection(realConnection); continue; } poolalbeConnection.getConnectionHolder().setLastCheckTimeMillis(System.currentTimeMillis()); @@ -300,6 +297,22 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } } + private void discardConnection(Connection realConnection) throws SQLException { + JdbcUtils.close(realConnection); + + try { + lock.lockInterruptibly(); + } catch (InterruptedException e) { + throw new SQLException("interrupt", e); + } + + try { + activeCount--; + } finally { + lock.unlock(); + } + } + private PoolableConnection getConnectionInternal() throws SQLException { PoolableConnection poolalbeConnection; @@ -361,8 +374,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat // exceptionSorter.isExceptionFatal if (exceptionSoter != null && exceptionSoter.isExceptionFatal(sqlEx)) { - decrementActiveCountWithLock(); - JdbcUtils.close(holder.getConnection()); + this.discardConnection(holder.getConnection()); pooledConnection.disable(); } @@ -490,20 +502,6 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat createConnectionCount++; } - void decrementActiveCountWithLock() throws SQLException { - try { - lock.lockInterruptibly(); - } catch (InterruptedException e) { - throw new SQLException("interrupt", e); - } - - try { - activeCount--; - } finally { - lock.unlock(); - } - } - void putLast(ConnectionHolder e) { if (e == null) { throw new NullPointerException();