You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2025/11/28 05:16:01 UTC
(shardingsphere) branch master updated: Clear current batch generatedKeys ResultSet (#37204)
This is an automated email from the ASF dual-hosted git repository.
zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new a6685e74777 Clear current batch generatedKeys ResultSet (#37204)
a6685e74777 is described below
commit a6685e74777a28058c8d0554f55c941304e10f09
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Fri Nov 28 13:15:54 2025 +0800
Clear current batch generatedKeys ResultSet (#37204)
* Clear current batch generatedKeys ResultSet
* Clear current batch generatedKeys ResultSet
* Clear current batch generatedKeys ResultSet
---
RELEASE-NOTES.md | 1 +
.../statement/ShardingSpherePreparedStatement.java | 12 ++++
.../ShardingSpherePreparedStatementTest.java | 76 ++++++++++++++++++++++
src/resources/idea/inspections.xml | 1 -
.../statement/ShardingPreparedStatementTest.java | 37 ++++++-----
5 files changed, 108 insertions(+), 19 deletions(-)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index a9307fd8e6e..972d6dfeaa7 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -89,6 +89,7 @@
1. JDBC: Support set data source properties type with java.time.Duration - [#35241](https://github.com/apache/shardingsphere/pull/35241)
1. JDBC: Resolve statement manager leaks when creating multiple statements - [#35665](https://github.com/apache/shardingsphere/pull/35665)
1. JDBC: Fix the issue where cached connections in DriverDatabaseConnectionManager were not released in time - [35834](https://github.com/apache/shardingsphere/pull/35834)
+1. JDBC: Clear batch generated keys result set when call clearBatch method - [37204](https://github.com/apache/shardingsphere/pull/37204)
1. Proxy: Fix `SHOW PROCESSLIST` not wait for all nodes - [#35348](https://github.com/apache/shardingsphere/pull/35348)
1. Proxy: Fix NoSuchElementException exception when execute MySQL SHOW VARIABLES without current database - [#35550](https://github.com/apache/shardingsphere/pull/35550)
1. Proxy: Fix column length for PostgreSQL string binary protocol value - [35840](https://github.com/apache/shardingsphere/pull/35840)
diff --git a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
index 9a54939b0c9..578a42b3193 100644
--- a/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
+++ b/jdbc/src/main/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatement.java
@@ -349,10 +349,22 @@ public final class ShardingSpherePreparedStatement extends AbstractPreparedState
@Override
public void clearBatch() {
currentResultSet = null;
+ closeCurrentBatchGeneratedKeysResultSet();
executeBatchExecutor.clear();
clearParameters();
}
+ private void closeCurrentBatchGeneratedKeysResultSet() {
+ if (null != currentBatchGeneratedKeysResultSet) {
+ try {
+ currentBatchGeneratedKeysResultSet.close();
+ } catch (final SQLException ignored) {
+ } finally {
+ currentBatchGeneratedKeysResultSet = null;
+ }
+ }
+ }
+
@SuppressWarnings("MagicConstant")
@Override
public int getResultSetType() {
diff --git a/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatementTest.java b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatementTest.java
new file mode 100644
index 00000000000..ab4880bee54
--- /dev/null
+++ b/jdbc/src/test/java/org/apache/shardingsphere/driver/jdbc/core/statement/ShardingSpherePreparedStatementTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.driver.jdbc.core.statement;
+
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import org.apache.shardingsphere.driver.jdbc.core.connection.ShardingSphereConnection;
+import org.apache.shardingsphere.driver.jdbc.core.resultset.GeneratedKeysResultSet;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+import org.apache.shardingsphere.parser.rule.SQLParserRule;
+import org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigurationBuilder;
+import org.apache.shardingsphere.sqlfederation.rule.SQLFederationRule;
+import org.apache.shardingsphere.sqlfederation.rule.builder.DefaultSQLFederationRuleConfigurationBuilder;
+import org.junit.jupiter.api.Test;
+import org.mockito.internal.configuration.plugins.Plugins;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Properties;
+
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class ShardingSpherePreparedStatementTest {
+
+ @SuppressWarnings("unchecked")
+ @Test
+ void assertClearBatchResetsCachedGeneratedKeysResultSet() throws SQLException, ReflectiveOperationException {
+ ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+ when(database.getProtocolType()).thenReturn(TypedSPILoader.getService(DatabaseType.class, "SQL92"));
+ when(database.getRuleMetaData()).thenReturn(new RuleMetaData(Collections.emptyList()));
+ ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+ when(metaData.getDatabase("foo_db")).thenReturn(database);
+ when(metaData.getGlobalRuleMetaData()).thenReturn(new RuleMetaData(Arrays.asList(
+ new SQLParserRule(new DefaultSQLParserRuleConfigurationBuilder().build()),
+ new SQLFederationRule(new DefaultSQLFederationRuleConfigurationBuilder().build(), Collections.emptyList()))));
+ when(metaData.getProps()).thenReturn(new ConfigurationProperties(new Properties()));
+ ShardingSphereConnection connection = mock(ShardingSphereConnection.class, RETURNS_DEEP_STUBS);
+ when(connection.getContextManager().getMetaDataContexts().getMetaData()).thenReturn(metaData);
+ when(connection.getCurrentDatabaseName()).thenReturn("foo_db");
+ ShardingSpherePreparedStatement preparedStatement = new ShardingSpherePreparedStatement(connection, "SELECT 1", Statement.RETURN_GENERATED_KEYS);
+ ResultSet cachedResultSet = new GeneratedKeysResultSet();
+ Plugins.getMemberAccessor().set(ShardingSpherePreparedStatement.class.getDeclaredField("currentBatchGeneratedKeysResultSet"), preparedStatement, cachedResultSet);
+ ((Collection<Comparable<?>>) Plugins.getMemberAccessor().get(ShardingSpherePreparedStatement.class.getDeclaredField("generatedValues"), preparedStatement)).add(1L);
+ preparedStatement.clearBatch();
+ ResultSet actual = preparedStatement.getGeneratedKeys();
+ assertThat(actual, not(cachedResultSet));
+ assertFalse(actual.isClosed());
+ }
+}
diff --git a/src/resources/idea/inspections.xml b/src/resources/idea/inspections.xml
index ebd966b9a57..70a26d382aa 100644
--- a/src/resources/idea/inspections.xml
+++ b/src/resources/idea/inspections.xml
@@ -824,7 +824,6 @@
</inspection_tool>
<inspection_tool class="ThrowsRuntimeException" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="TooBroadCatch" enabled="true" level="WARNING" enabled_by_default="true" />
- <inspection_tool class="TooBroadThrows" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="TrailingComma" enabled="false" level="WEAK WARNING" enabled_by_default="false" />
<inspection_tool class="TypeCustomizer" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="TypeParameterExtendsFinalClass" enabled="true" level="WARNING" enabled_by_default="true" />
diff --git a/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/statement/ShardingPreparedStatementTest.java b/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/statement/ShardingPreparedStatementTest.java
index 57c4ef93ae4..e08175a6513 100644
--- a/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/statement/ShardingPreparedStatementTest.java
+++ b/test/e2e/driver/src/test/java/org/apache/shardingsphere/test/e2e/driver/statement/ShardingPreparedStatementTest.java
@@ -180,24 +180,25 @@ class ShardingPreparedStatementTest extends AbstractShardingDriverTest {
for (int each : result) {
assertThat(each, is(4));
}
- ResultSet generateKeyResultSet = preparedStatement.getGeneratedKeys();
- assertTrue(generateKeyResultSet.next());
- assertThat(generateKeyResultSet.getLong(1), is(11L));
- assertTrue(generateKeyResultSet.next());
- assertThat(generateKeyResultSet.getLong(1), is(12L));
- assertTrue(generateKeyResultSet.next());
- assertThat(generateKeyResultSet.getLong(1), is(13L));
- assertTrue(generateKeyResultSet.next());
- assertThat(generateKeyResultSet.getLong(1), is(14L));
- assertTrue(generateKeyResultSet.next());
- assertThat(generateKeyResultSet.getLong(1), is(15L));
- assertTrue(generateKeyResultSet.next());
- assertThat(generateKeyResultSet.getLong(1), is(16L));
- assertTrue(generateKeyResultSet.next());
- assertThat(generateKeyResultSet.getLong(1), is(17L));
- assertTrue(generateKeyResultSet.next());
- assertThat(generateKeyResultSet.getLong(1), is(18L));
- assertFalse(generateKeyResultSet.next());
+ try (ResultSet generateKeyResultSet = preparedStatement.getGeneratedKeys()) {
+ assertTrue(generateKeyResultSet.next());
+ assertThat(generateKeyResultSet.getLong(1), is(11L));
+ assertTrue(generateKeyResultSet.next());
+ assertThat(generateKeyResultSet.getLong(1), is(12L));
+ assertTrue(generateKeyResultSet.next());
+ assertThat(generateKeyResultSet.getLong(1), is(13L));
+ assertTrue(generateKeyResultSet.next());
+ assertThat(generateKeyResultSet.getLong(1), is(14L));
+ assertTrue(generateKeyResultSet.next());
+ assertThat(generateKeyResultSet.getLong(1), is(15L));
+ assertTrue(generateKeyResultSet.next());
+ assertThat(generateKeyResultSet.getLong(1), is(16L));
+ assertTrue(generateKeyResultSet.next());
+ assertThat(generateKeyResultSet.getLong(1), is(17L));
+ assertTrue(generateKeyResultSet.next());
+ assertThat(generateKeyResultSet.getLong(1), is(18L));
+ assertFalse(generateKeyResultSet.next());
+ }
try (ResultSet resultSet = queryStatement.executeQuery(String.format(SELECT_FOR_INSERT_MULTI_VALUES_WITH_GENERATE_SHARDING_KEY_SQL, 11L))) {
assertTrue(resultSet.next());
assertThat(resultSet.getString(1), is("BATCH1"));