From 4321fae75262e0099fd96d3ff53c3209ff3d11d7 Mon Sep 17 00:00:00 2001 From: zy-kkk Date: Wed, 26 Jun 2024 09:56:00 +0800 Subject: [PATCH] [improvement](mysql catalog) disable mysql AbandonedConnectionCleanup Thread (#36655) When using mysql catalog, mysql jdbc driver will generate an `AbandonedConnectionCleanupThread` for each database connection. This is a virtual reference, which will accumulate over time as database connections are constantly created, eventually causing OOM. Therefore, in our usage scenario, we need to turn off this thread because our database connection recycling depends on the connection pool. But please note that this switch is only for MySQL JDBC Driver versions greater than 8.0.22 --- .../src/main/java/org/apache/doris/jdbc/JdbcExecutor.java | 3 +++ .../apache/doris/datasource/jdbc/client/JdbcMySQLClient.java | 2 ++ 2 files changed, 5 insertions(+) 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 0517786f398c7d..a2ef1936e8fa15 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 @@ -98,6 +98,9 @@ public JdbcExecutor(byte[] thriftParams) throws Exception { throw new InternalException(e.getMessage()); } tableType = request.table_type; + if (tableType == TOdbcTableType.MYSQL) { + System.setProperty("com.mysql.cj.disableAbandonedConnectionCleanup", "true"); + } this.config = new JdbcDataSourceConfig() .setCatalogId(request.catalog_id) .setJdbcUser(request.jdbc_user) diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcMySQLClient.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcMySQLClient.java index cd7f7aece3d1cc..ed39c890f7a21b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcMySQLClient.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcMySQLClient.java @@ -44,6 +44,8 @@ public class JdbcMySQLClient extends JdbcClient { protected JdbcMySQLClient(JdbcClientConfig jdbcClientConfig) { super(jdbcClientConfig); + // Disable abandoned connection cleanup + System.setProperty("com.mysql.cj.disableAbandonedConnectionCleanup", "true"); convertDateToNull = isConvertDatetimeToNull(jdbcClientConfig); Connection conn = null; Statement stmt = null;