diff --git a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java index 2e1da9731f..d90d0c37b4 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java +++ b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java @@ -60,7 +60,7 @@ public final class DruidConnectionHolder { private PreparedStatementPool statementPool; - private final List statementTrace = new ArrayList(2); + protected final List statementTrace = new ArrayList(2); private final boolean defaultReadOnly; private final int defaultHoldability; diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 1e86d27013..6bed703de5 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -22,6 +22,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.sql.Connection; import java.sql.SQLException; +import java.sql.Statement; import java.util.ArrayList; import java.util.Arrays; import java.util.ConcurrentModificationException; @@ -438,6 +439,17 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat this.setConnectionProperties(property); } } + { + String property = properties.getProperty("druid.maxPoolPreparedStatementPerConnectionSize"); + if (property != null && property.length() > 0) { + try { + int value = Integer.parseInt(property); + this.setMaxPoolPreparedStatementPerConnectionSize(value); + } catch (NumberFormatException e) { + LOG.error("illegal property 'druid.maxPoolPreparedStatementPerConnectionSize'", e); + } + } + } } public boolean isKillWhenSocketReadTimeout() { @@ -1443,6 +1455,12 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat } if (requireDiscard) { + if (holder.statementTrace != null) { + for (Statement stmt : holder.statementTrace) { + JdbcUtils.close(stmt); + } + } + this.discardConnection(holder.getConnection()); holder.setDiscard(true); } diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java index a347779bd3..d13715555d 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java @@ -167,14 +167,15 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. } } - stmt.getPreparedStatementHolder().decrementInUseCount(); + PreparedStatementHolder stmtHolder = stmt.getPreparedStatementHolder(); + stmtHolder.decrementInUseCount(); if (stmt.isPooled() && holder.isPoolPreparedStatements() && stmt.exceptionCount == 0) { - holder.getStatementPool().put(stmt.getPreparedStatementHolder()); + holder.getStatementPool().put(stmtHolder); stmt.clearResultSet(); holder.removeTrace(stmt); - stmt.getPreparedStatementHolder().setFetchRowPeak(stmt.getFetchRowPeak()); + stmtHolder.setFetchRowPeak(stmt.getFetchRowPeak()); stmt.setClosed(true); // soft set close } else if (stmt.isPooled() && holder.isPoolPreparedStatements()) { @@ -182,7 +183,8 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. stmt.clearResultSet(); holder.removeTrace(stmt); - holder.getStatementPool().remove(stmt.getPreparedStatementHolder()); + holder.getStatementPool() + .remove(stmtHolder); } else { try { //Connection behind the statement may be in invalid state, which will throw a SQLException.