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 <[email protected]>
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"));