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

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 2c154c6d971 [fix](jdbc catalog) Fix Memory Leak by Enabling Weak 
References in HikariCP (#39582)
2c154c6d971 is described below

commit 2c154c6d9710c16d6057e0d08ba866521a12bbb0
Author: zy-kkk <[email protected]>
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 eea57efbf14..3e681fa1519 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();
     }
@@ -309,7 +310,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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to