From 749c180497a37c9408ecb62b39f0b8c74dc5353a Mon Sep 17 00:00:00 2001 From: zy-kkk Date: Wed, 21 Aug 2024 10:42:35 +0800 Subject: [PATCH 1/2] [improvement](jdbc catalog) Force all resources to be closed in the close method --- .../org/apache/doris/jdbc/JdbcExecutor.java | 32 +++++-------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java index 17576c5b2cf83d..e479d918f401b4 100644 --- a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java +++ b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java @@ -125,25 +125,18 @@ public boolean isNebula() { public void close() throws Exception { try { - if (stmt != null) { + if (stmt != null && !stmt.isClosed()) { try { stmt.cancel(); } catch (SQLException e) { - LOG.error("Error cancelling statement", e); + LOG.warn("Cannot cancelling statement: ", e); } } - boolean shouldAbort = conn != null && resultSet != null - && (tableType == TOdbcTableType.MYSQL || tableType == TOdbcTableType.SQLSERVER); - boolean aborted = false; // Used to record whether the abort operation is performed - if (shouldAbort) { - aborted = abortReadConnection(conn, resultSet, tableType); - } - - // If no abort operation is performed, the resource needs to be closed manually - if (!aborted) { - closeResources(resultSet, stmt, conn); + if (conn != null && resultSet != null) { + abortReadConnection(conn, resultSet); } + closeResources(resultSet, stmt, conn); } finally { if (config.getConnectionPoolMinSize() == 0 && hikariDataSource != null) { hikariDataSource.close(); @@ -157,32 +150,23 @@ private void closeResources(AutoCloseable... closeables) { for (AutoCloseable closeable : closeables) { if (closeable != null) { try { - if (closeable instanceof Connection) { - if (!((Connection) closeable).isClosed()) { - closeable.close(); - } - } else { - closeable.close(); - } + closeable.close(); } catch (Exception e) { - LOG.error("Cannot close resource: ", e); + LOG.warn("Cannot close resource: ", e); } } } } - public boolean abortReadConnection(Connection connection, ResultSet resultSet, TOdbcTableType tableType) + public void abortReadConnection(Connection connection, ResultSet resultSet, TOdbcTableType tableType) throws SQLException { if (!resultSet.isAfterLast() && (tableType == TOdbcTableType.MYSQL || tableType == TOdbcTableType.SQLSERVER)) { // Abort connection before closing. Without this, the MySQL/SQLServer driver // attempts to drain the connection by reading all the results. connection.abort(MoreExecutors.directExecutor()); - return true; } - return false; } - public void cleanDataSource() { if (hikariDataSource != null) { hikariDataSource.close(); From 5d4b1561361e8e54586d0a9ac37250cf12cc2e1b Mon Sep 17 00:00:00 2001 From: zy-kkk Date: Thu, 22 Aug 2024 10:36:25 +0800 Subject: [PATCH 2/2] fix --- .../src/main/java/org/apache/doris/jdbc/JdbcExecutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java index e479d918f401b4..a3856a1156cdf4 100644 --- a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java +++ b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutor.java @@ -134,7 +134,7 @@ public void close() throws Exception { } if (conn != null && resultSet != null) { - abortReadConnection(conn, resultSet); + abortReadConnection(conn, resultSet, tableType); } closeResources(resultSet, stmt, conn); } finally {