diff --git a/src/main/java/com/alibaba/druid/pool/ConnectionHolder.java b/src/main/java/com/alibaba/druid/pool/ConnectionHolder.java index d884b05fcb..ce6f288124 100644 --- a/src/main/java/com/alibaba/druid/pool/ConnectionHolder.java +++ b/src/main/java/com/alibaba/druid/pool/ConnectionHolder.java @@ -53,7 +53,7 @@ public final class ConnectionHolder { this.lastActiveTimeMillis = connecttimeMillis; if (this.poolPreparedStatements) { - statementPool = new PreparedStatementPool(); + statementPool = new PreparedStatementPool(dataSource.getMaxPoolPreparedStatementPerConnectionSize()); } else { statementPool = null; } diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index a08e83449c..03bdea2f11 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -118,7 +118,7 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements private boolean testOnReturn = DEFAULT_TEST_ON_RETURN; private boolean testWhileIdle = DEFAULT_WHILE_IDLE; protected boolean poolPreparedStatements = false; - protected int maxPoolPreparedStatementPerConnectionSize = -1; + protected int maxPoolPreparedStatementPerConnectionSize = 10; protected boolean inited = false; @@ -192,11 +192,11 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements public Histogram getTransactionHistogram() { return transactionHistogram; } - + public void incrementPreparedStatementCount() { reusePreparedStatement.incrementAndGet(); } - + public long getReusePreparedStatement() { return reusePreparedStatement.get(); } diff --git a/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java b/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java index 1e3878a22a..724814d0fe 100644 --- a/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java +++ b/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java @@ -16,16 +16,20 @@ package com.alibaba.druid.pool; import java.sql.PreparedStatement; -import java.util.HashMap; import com.alibaba.druid.pool.PoolablePreparedStatement.PreparedStatementKey; +import com.alibaba.druid.util.LRUCache; /** * @author wenshao */ public class PreparedStatementPool { - private HashMap map = new HashMap(); + private final LRUCache map; + + public PreparedStatementPool(int maxSize){ + map = new LRUCache(maxSize); + } public static enum MethodType { M1, M2, M3, M4, M5, M6, Precall_1, Precall_2, Precall_3 @@ -40,7 +44,7 @@ public class PreparedStatementPool { map.put(key, poolableStatement.getRawPreparedStatement()); } - public HashMap getMap() { + public LRUCache getMap() { return map; } diff --git a/src/main/java/com/alibaba/druid/util/LRUCache.java b/src/main/java/com/alibaba/druid/util/LRUCache.java new file mode 100644 index 0000000000..936898f571 --- /dev/null +++ b/src/main/java/com/alibaba/druid/util/LRUCache.java @@ -0,0 +1,19 @@ +package com.alibaba.druid.util; + +import java.util.LinkedHashMap; +import java.util.Map.Entry; + +public class LRUCache extends LinkedHashMap { + + private static final long serialVersionUID = 1L; + protected int maxElements; + + public LRUCache(int maxSize){ + super(maxSize); + this.maxElements = maxSize; + } + + protected boolean removeEldestEntry(Entry eldest) { + return (size() > this.maxElements); + } +}