From f5ca7a155bc4c28c9b0967b531fc8b4aaa0aa588 Mon Sep 17 00:00:00 2001 From: /bin/eash Date: Sat, 8 Feb 2025 11:46:14 +0800 Subject: [PATCH] branch-2.0: [fix](mem leak) fe non_heap mem leak while use jdbc catalog #45806 --- .../doris/datasource/jdbc/client/JdbcClient.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcClient.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcClient.java index 455c9bbc4eb822..aaae8993fcd889 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcClient.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcClient.java @@ -53,6 +53,8 @@ public abstract class JdbcClient { private static final int HTTP_TIMEOUT_MS = 10000; protected static final int JDBC_DATETIME_SCALE = 6; + private static final Map classLoaderMap = new ConcurrentHashMap<>(); + private String catalog; protected String dbType; protected String jdbcUser; @@ -145,11 +147,16 @@ private void initializeDataSource(JdbcClientConfig config) { } } - private void initializeClassLoader(JdbcClientConfig config) { + private synchronized void initializeClassLoader(JdbcClientConfig config) { try { URL[] urls = {new URL(JdbcResource.getFullDriverUrl(config.getDriverUrl()))}; - ClassLoader parent = getClass().getClassLoader(); - this.classLoader = URLClassLoader.newInstance(urls, parent); + if (classLoaderMap.containsKey(urls[0])) { + this.classLoader = classLoaderMap.get(urls[0]); + } else { + ClassLoader parent = getClass().getClassLoader(); + this.classLoader = URLClassLoader.newInstance(urls, parent); + classLoaderMap.put(urls[0], this.classLoader); + } } catch (MalformedURLException e) { throw new RuntimeException("Error loading JDBC driver.", e); }