diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 45a422b923..7563842a42 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -178,6 +178,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements protected final AtomicLong commitCount = new AtomicLong(); protected final AtomicLong startTransactionCount = new AtomicLong(); protected final AtomicLong rollbackCount = new AtomicLong(); + protected final AtomicLong reusePreparedStatement = new AtomicLong(); protected final Histogram transactionHistogram = new Histogram( 10, @@ -189,6 +190,14 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements public Histogram getTransactionHistogram() { return transactionHistogram; } + + public void incrementPreparedStatementCount() { + reusePreparedStatement.incrementAndGet(); + } + + public long getReusePreparedStatement() { + return reusePreparedStatement.get(); + } public long getTransactionThresholdMillis() { return transactionThresholdMillis; @@ -203,7 +212,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements public long[] getTransactionHistogramValues() { return transactionHistogram.toArray(); } - + public long[] getTransactionHistogramRanges() { return transactionHistogram.getRanges(); } @@ -569,10 +578,6 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements } public void setPoolPreparedStatements(boolean poolPreparedStatements) { - if (inited) { - throw new UnsupportedOperationException(); - } - this.poolPreparedStatements = poolPreparedStatements; } diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java index ff9ed75e62..7ebf1c0ea3 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java @@ -117,4 +117,6 @@ public interface DruidAbstractDataSourceMBean { void setTransactionThresholdMillis(long transactionThresholdMillis); long getTransactionThresholdMillis(); + + long getReusePreparedStatement(); } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 58c27dc3b0..3eb6aa73de 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1157,6 +1157,6 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat @Override public String getVersion() { - return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion + "-2011-09-11 17:31"; + return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion + "-2011-09-28 22:44"; } } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSourceMBean.java b/src/main/java/com/alibaba/druid/pool/DruidDataSourceMBean.java index 542a21ae52..de664a91df 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSourceMBean.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSourceMBean.java @@ -52,6 +52,8 @@ public interface DruidDataSourceMBean extends DruidAbstractDataSourceMBean { void setResetStatEnable(boolean resetStatEnable); String getVersion(); + + void setPoolPreparedStatements(boolean poolPreparedStatements); /** * ActiveCount峰值 diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index 95e3e27de0..9951abdfba 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -42,6 +42,7 @@ import com.alibaba.druid.logging.Log; import com.alibaba.druid.logging.LogFactory; import com.alibaba.druid.pool.PoolablePreparedStatement.PreparedStatementKey; import com.alibaba.druid.pool.PreparedStatementPool.MethodType; +import com.alibaba.druid.util.JdbcUtils; import com.alibaba.druid.util.TransactionInfo; /** @@ -103,6 +104,15 @@ public class PoolableConnection implements PooledConnection, Connection { public Connection getConnection() { return conn; } + + void closePoolableStatement() { + PreparedStatementPool statmentPool = holder.getStatementPool(); + if (statmentPool != null) { + for (PreparedStatement stmt : statmentPool.getMap().values()) { + JdbcUtils.close(stmt); + } + } + } void disable() { this.holder = null; @@ -155,6 +165,8 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } + } else { + holder.getDataSource().incrementPreparedStatementCount(); } holder.getDataSource().initStatement(stmt); @@ -185,6 +197,8 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } + } else { + holder.getDataSource().incrementPreparedStatementCount(); } holder.getDataSource().initStatement(stmt); @@ -215,6 +229,8 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } + } else { + holder.getDataSource().incrementPreparedStatementCount(); } holder.getDataSource().initStatement(stmt); @@ -243,6 +259,8 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } + } else { + holder.getDataSource().incrementPreparedStatementCount(); } holder.getDataSource().initStatement(stmt); @@ -271,6 +289,8 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } + } else { + holder.getDataSource().incrementPreparedStatementCount(); } holder.getDataSource().initStatement(stmt); @@ -299,6 +319,8 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } + } else { + holder.getDataSource().incrementPreparedStatementCount(); } holder.getDataSource().initStatement(stmt); @@ -330,6 +352,8 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } + } else { + holder.getDataSource().incrementPreparedStatementCount(); } holder.getDataSource().initStatement(stmt); @@ -359,6 +383,8 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } + } else { + holder.getDataSource().incrementPreparedStatementCount(); } holder.getDataSource().initStatement(stmt); @@ -387,6 +413,8 @@ public class PoolableConnection implements PooledConnection, Connection { } catch (SQLException ex) { handleException(ex); } + } else { + holder.getDataSource().incrementPreparedStatementCount(); } holder.getDataSource().initStatement(stmt);