This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 2868ad45d01e34474b24ba9da5879b9db00e4b2d
Author: zy-kkk <zhongy...@gmail.com>
AuthorDate: Fri Aug 23 14:08:19 2024 +0800

    [fix](jdbc catalog) Fix Memory Leak by Enabling Weak References in HikariCP 
(#39582)
    
    This PR addresses a memory leak issue caused by FastList objects in
    HikariCP being retained by ThreadLocal variables, which are not easily
    garbage collected in long-running JNI threads. To mitigate this, a
    system property com.zaxxer.hikari.useWeakReferences is set to true,
    ensuring that WeakReference is used for ThreadLocal objects, allowing
    the garbage collector to reclaim memory more effectively.
    Even though setting this will affect some performance, solving resource
    leaks is relatively more important
    Performance difference before and after setting
    Before setting:
    10 concurrency 0.02-0.05
    100 concurrency 0.18-0.4
    After setting:
    10 concurrency 0.02-0.07
    100 concurrency 0.18-0.7
---
 .../src/main/java/org/apache/doris/jdbc/BaseJdbcExecutor.java       | 3 ++-
 .../src/main/java/org/apache/doris/jdbc/JdbcDataSource.java         | 6 ++++--
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git 
a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/BaseJdbcExecutor.java
 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/BaseJdbcExecutor.java
index b25294021ee..23ab66f5763 100644
--- 
a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/BaseJdbcExecutor.java
+++ 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/BaseJdbcExecutor.java
@@ -94,6 +94,7 @@ public abstract class BaseJdbcExecutor implements 
JdbcExecutor {
                 
.setConnectionPoolMaxLifeTime(request.connection_pool_max_life_time)
                 
.setConnectionPoolKeepAlive(request.connection_pool_keep_alive);
         
JdbcDataSource.getDataSource().setCleanupInterval(request.connection_pool_cache_clear_time);
+        System.setProperty("com.zaxxer.hikari.useWeakReferences", "true");
         init(config, request.statement);
         this.jdbcDriverVersion = getJdbcDriverVersion();
     }
@@ -322,7 +323,7 @@ public abstract class BaseJdbcExecutor implements 
JdbcExecutor {
                             
ds.setKeepaliveTime(config.getConnectionPoolMaxLifeTime() / 5L); // default 6 
min
                         }
                         hikariDataSource = ds;
-                        
JdbcDataSource.getDataSource().putSource(hikariDataSourceKey, ds);
+                        
JdbcDataSource.getDataSource().putSource(hikariDataSourceKey, hikariDataSource);
                         LOG.info("JdbcClient set"
                                 + " ConnectionPoolMinSize = " + 
config.getConnectionPoolMinSize()
                                 + ", ConnectionPoolMaxSize = " + 
config.getConnectionPoolMaxSize()
diff --git 
a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcDataSource.java
 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcDataSource.java
index 447566596a7..1aea763852f 100644
--- 
a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcDataSource.java
+++ 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcDataSource.java
@@ -59,8 +59,10 @@ public class JdbcDataSource {
     }
 
     public void setCleanupInterval(long interval) {
-        this.cleanupInterval = interval * 1000L;
-        restartCleanupTask();
+        if (this.cleanupInterval != interval * 1000L) {
+            this.cleanupInterval = interval * 1000L;
+            restartCleanupTask();
+        }
     }
 
     private synchronized void restartCleanupTask() {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to