diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java b/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java index 20e4cbecfa..58a55ebc44 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledStatement.java @@ -55,7 +55,19 @@ public class DruidPooledStatement extends PoolableWrapper implements Statement { protected void addResultSetTrace(ResultSet resultSet) { if (resultSetTrace == null) { resultSetTrace = new ArrayList(1); + } else if (resultSetTrace.size() > 0) { + int lastIndex = resultSetTrace.size() - 1; + ResultSet lastResultSet = resultSetTrace.get(lastIndex); + try { + if (lastResultSet.isClosed()) { + resultSetTrace.set(lastIndex, resultSet); + return; + } + } catch (SQLException ex) { + // skip + } } + resultSetTrace.add(resultSet); } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/basic/PoolableCallableStatementTest.java b/src/test/java/com/alibaba/druid/bvt/pool/basic/PoolableCallableStatementTest.java index 975d17dcf6..8cb87e3afc 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/basic/PoolableCallableStatementTest.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/basic/PoolableCallableStatementTest.java @@ -17,16 +17,7 @@ package com.alibaba.druid.bvt.pool.basic; import java.io.InputStream; import java.io.Reader; -import java.sql.Blob; -import java.sql.Clob; -import java.sql.Date; -import java.sql.NClob; -import java.sql.RowId; -import java.sql.SQLException; -import java.sql.SQLXML; -import java.sql.Time; -import java.sql.Timestamp; -import java.sql.Types; +import java.sql.*; import org.junit.Assert; import junit.framework.TestCase; @@ -73,6 +64,13 @@ public class PoolableCallableStatementTest extends TestCase { Assert.assertEquals(2, raw.getOutParameters().size()); } + public void test_executeQuery_large() throws Exception { + for (int i = 0; i < 1000 * 1000; ++i) { + ResultSet rs = stmt.executeQuery(); + rs.close(); + } + } + public void test_basic() throws Exception { Assert.assertEquals(raw, stmt.getCallableStatementRaw()); }