From 38fcc483f6e58b8b9c17dff6ce4ac52984b3362a Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 28 Sep 2011 23:45:54 +0000 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=BF=9BPreparedStatementCache?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: http://code.alibabatech.com/svn/druid/trunk@915 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../alibaba/druid/pool/ConnectionHolder.java | 2 +- .../druid/pool/DruidAbstractDataSource.java | 6 +++--- .../druid/pool/PreparedStatementPool.java | 10 +++++++--- .../java/com/alibaba/druid/util/LRUCache.java | 19 +++++++++++++++++++ 4 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/util/LRUCache.java 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); + } +}