diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index c4bb2263fd..06b6c3bf50 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -198,6 +198,10 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements public void incrementClosedPreparedStatementCount() { closedPreparedStatementCount.incrementAndGet(); } + + public long getClosedPreparedStatementCount() { + return closedPreparedStatementCount.get(); + } public void incrementPreparedStatementCount() { preparedStatementCount.incrementAndGet(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java index 2fdb4a337b..eded92ecbe 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSourceMBean.java @@ -123,4 +123,6 @@ public interface DruidAbstractDataSourceMBean { long getReusePreparedStatementCount(); long getPreparedStatementCount(); + + long getClosedPreparedStatementCount(); } diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 7227c190e1..d5c2876255 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -1217,6 +1217,6 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat @Override public String getVersion() { - return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion + "-2011-10-08 17:28"; + return VERSION.MajorVersion + "." + VERSION.MinorVersion + "." + VERSION.RevisionVersion + "-2011-10-09 11:42"; } } diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index 8daa55399e..f6e2a076e3 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -188,7 +188,7 @@ public class PoolableConnection implements PooledConnection, Connection { if (stmtHolder == null) { try { stmtHolder = new PreparedStatementHolder(key, conn.prepareStatement(sql, resultSetType, - resultSetConcurrency)); + resultSetConcurrency)); holder.getDataSource().incrementPreparedStatementCount(); } catch (SQLException ex) { handleException(ex); @@ -383,8 +383,8 @@ public class PoolableConnection implements PooledConnection, Connection { if (stmtHolder == null) { try { stmtHolder = new PreparedStatementHolder(key, conn.prepareCall(sql, resultSetType, - resultSetConcurrency, - resultSetHoldability)); + resultSetConcurrency, + resultSetHoldability)); holder.getDataSource().incrementPreparedStatementCount(); } catch (SQLException ex) { handleException(ex); @@ -415,8 +415,8 @@ public class PoolableConnection implements PooledConnection, Connection { if (stmtHolder == null) { try { - stmtHolder = new PreparedStatementHolder(key, - conn.prepareCall(sql, resultSetType, resultSetConcurrency)); + stmtHolder = new PreparedStatementHolder(key, conn.prepareCall(sql, resultSetType, + resultSetConcurrency)); holder.getDataSource().incrementPreparedStatementCount(); } catch (SQLException ex) { handleException(ex); diff --git a/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java b/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java index dba0af5f01..8f806ec1ef 100644 --- a/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java +++ b/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java @@ -27,7 +27,7 @@ import com.alibaba.druid.pool.PoolablePreparedStatement.PreparedStatementKey; public class PreparedStatementPool { private final Map map; - private final DruidAbstractDataSource dataSource; + private final DruidAbstractDataSource dataSource; public PreparedStatementPool(ConnectionHolder holder){ this.dataSource = holder.getDataSource(); @@ -35,7 +35,7 @@ public class PreparedStatementPool { if (initCapacity <= 0) { initCapacity = 16; } - map = new LRUCache(initCapacity); + map = new LRUCache(initCapacity); } public static enum MethodType { @@ -64,7 +64,7 @@ public class PreparedStatementPool { return map; } - public class LRUCache extends LinkedHashMap { + public class LRUCache extends LinkedHashMap { private static final long serialVersionUID = 1L; @@ -72,8 +72,14 @@ public class PreparedStatementPool { super(maxSize); } - protected boolean removeEldestEntry(Entry eldest) { - return (size() > dataSource.getMaxPoolPreparedStatementPerConnectionSize()); + protected boolean removeEldestEntry(Entry eldest) { + boolean remove = (size() > dataSource.getMaxPoolPreparedStatementPerConnectionSize()); + + if (remove) { + dataSource.closePreapredStatement(eldest.getValue()); + } + + return remove; } } }