From 45e8206dff0e503cc4a3510cf065f6f926d0f4dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Thu, 6 May 2021 19:33:38 +0800 Subject: [PATCH] bug fixed for DruidPooledStatement trace ResultSet, fix #4254 --- .../druid/pool/DruidPooledStatement.java | 12 ++++++++++++ .../basic/PoolableCallableStatementTest.java | 18 ++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) 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()); }