From f6a94cd47b1d568358b995e2b81af419079aa4fb Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 16 Nov 2011 10:34:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=8A=A8=E6=80=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9PoolPreparedStatement=E5=8F=82=E6=95=B0=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../druid/pool/PoolableConnection.java | 36 ++++++++++++++----- .../druid/pool/PreparedStatementPool.java | 10 +++++- .../bvt/pool/TestPoolPreparedStatement2.java | 27 ++++++++++++-- 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java index 3461b1855d..e5df0762dd 100644 --- a/src/main/java/com/alibaba/druid/pool/PoolableConnection.java +++ b/src/main/java/com/alibaba/druid/pool/PoolableConnection.java @@ -155,7 +155,9 @@ public class PoolableConnection implements PooledConnection, Connection { try { stmtHolder = new PreparedStatementHolder(key, conn.prepareStatement(sql)); holder.getDataSource().incrementPreparedStatementCount(); - holder.getStatementPool().put(stmtHolder); + if (holder.isPoolPreparedStatements()) { + holder.getStatementPool().put(stmtHolder); + } } catch (SQLException ex) { handleException(ex); } @@ -190,7 +192,9 @@ public class PoolableConnection implements PooledConnection, Connection { stmtHolder = new PreparedStatementHolder(key, conn.prepareStatement(sql, resultSetType, resultSetConcurrency)); holder.getDataSource().incrementPreparedStatementCount(); - holder.getStatementPool().put(stmtHolder); + if (holder.isPoolPreparedStatements()) { + holder.getStatementPool().put(stmtHolder); + } } catch (SQLException ex) { handleException(ex); } @@ -226,7 +230,9 @@ public class PoolableConnection implements PooledConnection, Connection { resultSetConcurrency, resultSetHoldability)); holder.getDataSource().incrementPreparedStatementCount(); - holder.getStatementPool().put(stmtHolder); + if (holder.isPoolPreparedStatements()) { + holder.getStatementPool().put(stmtHolder); + } } catch (SQLException ex) { handleException(ex); } @@ -258,7 +264,9 @@ public class PoolableConnection implements PooledConnection, Connection { try { stmtHolder = new PreparedStatementHolder(key, conn.prepareStatement(sql, columnIndexes)); holder.getDataSource().incrementPreparedStatementCount(); - holder.getStatementPool().put(stmtHolder); + if (holder.isPoolPreparedStatements()) { + holder.getStatementPool().put(stmtHolder); + } } catch (SQLException ex) { handleException(ex); } @@ -290,7 +298,9 @@ public class PoolableConnection implements PooledConnection, Connection { try { stmtHolder = new PreparedStatementHolder(key, conn.prepareStatement(sql, columnNames)); holder.getDataSource().incrementPreparedStatementCount(); - holder.getStatementPool().put(stmtHolder); + if (holder.isPoolPreparedStatements()) { + holder.getStatementPool().put(stmtHolder); + } } catch (SQLException ex) { handleException(ex); } @@ -322,7 +332,9 @@ public class PoolableConnection implements PooledConnection, Connection { try { stmtHolder = new PreparedStatementHolder(key, conn.prepareStatement(sql, autoGeneratedKeys)); holder.getDataSource().incrementPreparedStatementCount(); - holder.getStatementPool().put(stmtHolder); + if (holder.isPoolPreparedStatements()) { + holder.getStatementPool().put(stmtHolder); + } } catch (SQLException ex) { handleException(ex); } @@ -357,7 +369,9 @@ public class PoolableConnection implements PooledConnection, Connection { try { stmtHolder = new PreparedStatementHolder(key, conn.prepareCall(sql)); holder.getDataSource().incrementPreparedStatementCount(); - holder.getStatementPool().put(stmtHolder); + if (holder.isPoolPreparedStatements()) { + holder.getStatementPool().put(stmtHolder); + } } catch (SQLException ex) { handleException(ex); } @@ -392,7 +406,9 @@ public class PoolableConnection implements PooledConnection, Connection { resultSetConcurrency, resultSetHoldability)); holder.getDataSource().incrementPreparedStatementCount(); - holder.getStatementPool().put(stmtHolder); + if (holder.isPoolPreparedStatements()) { + holder.getStatementPool().put(stmtHolder); + } } catch (SQLException ex) { handleException(ex); } @@ -425,7 +441,9 @@ public class PoolableConnection implements PooledConnection, Connection { stmtHolder = new PreparedStatementHolder(key, conn.prepareCall(sql, resultSetType, resultSetConcurrency)); holder.getDataSource().incrementPreparedStatementCount(); - holder.getStatementPool().put(stmtHolder); + if (holder.isPoolPreparedStatements()) { + holder.getStatementPool().put(stmtHolder); + } } 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 d73323ee52..99e7d2e579 100644 --- a/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java +++ b/src/main/java/com/alibaba/druid/pool/PreparedStatementPool.java @@ -15,6 +15,8 @@ */ package com.alibaba.druid.pool; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; @@ -52,7 +54,13 @@ public class PreparedStatementPool { return holder; } - public void put(PreparedStatementHolder holder) { + public void put(PreparedStatementHolder holder) throws SQLException { + PreparedStatement stmt = holder.getStatement(); + + if (stmt.isClosed()) { + return; + } + PreparedStatementKey key = holder.getKey(); PreparedStatementHolder oldHolder = map.put(key, holder); if (oldHolder != null) { diff --git a/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement2.java b/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement2.java index 30b183ad0f..8fa1d3a178 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement2.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/TestPoolPreparedStatement2.java @@ -34,7 +34,7 @@ public class TestPoolPreparedStatement2 extends TestCase { dataSource.setTestOnBorrow(false); dataSource.setValidationQuery("SELECT 1"); dataSource.setFilters("stat"); - dataSource.setPoolPreparedStatements(true); + dataSource.setPoolPreparedStatements(false); dataSource.setMaxPoolPreparedStatementPerConnectionSize(20); } @@ -44,7 +44,30 @@ public class TestPoolPreparedStatement2 extends TestCase { } public void test_stmtCache() throws Exception { - + for (int j = 0; j < 10; ++j) { + for (int i = 0; i < 10; ++i) { + Connection conn = dataSource.getConnection(); + String sql = "SELECT" + i; + PreparedStatement stmt = conn.prepareStatement(sql); + stmt.execute(); + stmt.close(); + conn.close(); + } + } + + dataSource.setPoolPreparedStatements(true); + + for (int j = 0; j < 10; ++j) { + for (int i = 0; i < 10; ++i) { + Connection conn = dataSource.getConnection(); + String sql = "SELECT" + i; + PreparedStatement stmt = conn.prepareStatement(sql); + stmt.execute(); + stmt.close(); + conn.close(); + } + } + for (int i = 0; i < 1000 * 100 * 1; ++i) { Connection conn = dataSource.getConnection(); PreparedStatement stmt = conn.prepareStatement("SELECT " + i);