bug fixed for concurrent close & discard connection

This commit is contained in:
高铁
2019-11-25 22:45:15 +08:00
parent bd8e80bdd8
commit ef2d83f74a
2 changed files with 25 additions and 5 deletions
@@ -69,6 +69,7 @@ public final class DruidConnectionHolder {
protected int underlyingTransactionIsolation;
protected boolean underlyingAutoCommit;
protected volatile boolean discard = false;
protected volatile boolean active = false;
protected final Map<String, Object> variables;
protected final Map<String, Object> globleVariables;
final ReentrantLock lock = new ReentrantLock();
@@ -1493,6 +1493,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
* 抛弃连接,不进行回收,而是抛弃
*
* @param realConnection
* @deprecated
*/
public void discardConnection(Connection realConnection) {
JdbcUtils.close(realConnection);
@@ -1526,7 +1527,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
return;
}
activeCount--;
if (holder.active) {
activeCount--;
holder.active = false;
}
discardCount++;
holder.discard = true;
@@ -1580,6 +1584,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
try {
if (activeCount < maxActive) {
activeCount++;
holder.active = true;
if (activeCount > activePeak) {
activePeak = activeCount;
activePeakTime = System.currentTimeMillis();
@@ -1661,7 +1666,12 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
}
if (holder != null) {
if (holder.discard) {
continue;
}
activeCount++;
holder.active = true;
if (activeCount > activePeak) {
activePeak = activeCount;
activePeakTime = System.currentTimeMillis();
@@ -1906,7 +1916,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
if (physicalConnection.isClosed()) {
lock.lock();
try {
activeCount--;
if (holder.active) {
activeCount--;
holder.active = false;
}
closeCount++;
} finally {
lock.unlock();
@@ -1923,7 +1936,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
lock.lock();
try {
activeCount--;
if (holder.active) {
activeCount--;
holder.active = false;
}
closeCount++;
} finally {
lock.unlock();
@@ -1950,7 +1966,10 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
lock.lock();
try {
activeCount--;
if (holder.active) {
activeCount--;
holder.active = false;
}
closeCount++;
result = putLast(holder, currentTimeMillis);
@@ -2113,7 +2132,7 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat
}
boolean putLast(DruidConnectionHolder e, long lastActiveTimeMillis) {
if (poolingCount >= maxActive) {
if (poolingCount >= maxActive || e.discard) {
return false;
}