You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多租户Spring应用用Hikari连接Snowflake致线程激增引发内存问题

问题:Spring Web应用连接Snowflake时线程激增引发内存问题

我在Tomcat上部署了一个Spring Web应用,通过AbstractRoutingDataSource根据配置连接MySQL和Snowflake,所有数据源都存入Map中。目前发现系统会创建大量线程,进而引发内存问题,无法确定这是Hikari数据库连接池的并发问题,还是底层Snowflake驱动的问题。将Snowflake数据源替换为其他MySQL数据源后,一切运行正常。

Snowflake数据源配置代码

public DataSource getSFDataSource(CommonTenantEntity tenant) {
        //it's assumed its snoflake at this point
        HikariConfig config = new HikariConfig();
        config.setDriverClassName(<Datsource drive name>);
        config.setJdbcUrl(<URL to Snowflake>);
        config.setUsername(<Username>);
        config.setPassword(<Password>);
        config.setPoolName(org.springframework.util.StringUtils.isEmpty(SUFFIX_SF) ?
        config.setMaximumPoolSize(<Pool size>);
        config.setConnectionTimeout(<Timeout>);
        config.addDataSourceProperty("cachePrepStmts", "true");
        config.addDataSourceProperty("prepStmtCacheSize", "250");
        config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        config.addDataSourceProperty("zeroDateTimeBehavior", "convertToNull");
        config.addDataSourceProperty("useLegacyDatetimeCode", "false");
        config.setLeakDetectionThreshold(3000);
        config.setIdleTimeout(3000);
       config.addDataSourceProperty("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.OrgSFPhysicalNamingStrategyImpl");
       config.addDataSourceProperty("hibernate.implicit_naming_strategy", "CustomNamingStrategy");
        return new HikariDataSource(config);
    }

捕获的线程Dump信息

"integration-snowflake-4 housekeeper" - Thread t@122
   java.lang.Thread.State: TIMED_WAITING
        at java.base@11.0.16/jdk.internal.misc.Unsafe.park(Native Method)
        - parking to wait for <6cb5eb65> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.base@11.0.16/java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:234)
        at java.base@11.0.16/java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2123)
        at java.base@11.0.16/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1182)
        at java.base@11.0.16/java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:899)
        at java.base@11.0.16/java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1054)
        at java.base@11.0.16/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1114)
        at java.base@11.0.16/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base@11.0.16/java.lang.Thread.run(Thread.java:829)

   Locked ownable synchronizers:
        - None

"integration-snowflake-4 connection adder" - Thread t@123
   java.lang.Thread.State: RUNNABLE
        at java.base@11.0.16/java.net.SocketInputStream.socketRead0(Native Method)
        at java.base@11.0.16/java.net.SocketInputStream.socketRead(SocketInputStream.java:115)
        at java.base@11.0.16/java.net.SocketInputStream.read(SocketInputStream.java:168)
        at java.base@11.0.16/java.net.SocketInputStream.read(SocketInputStream.java:140)
        at java.base@11.0.16/sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:478)
        at java.base@11.0.16/sun.security.ssl.SSLSocketInputRecord.readHeader(SSLSocketInputRecord.java:472)
        at java.base@11.0.16/sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:70)
        at java.base@11.0.16/sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1454)
        at java.base@11.0.16/sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:1065)
        at net.snowflake.client.jdbc.internal.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
        at net.snowflake.client.jdbc.internal.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
        at net.snowflake.client.jdbc.internal.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
        at net.snowflake.client.jdbc.internal.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
        at net.snowflake.client.jdbc.internal.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
        at net.snowflake.client.jdbc.internal.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
        at net.snowflake.client.jdbc.internal.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
        at net.snowflake.client.jdbc.internal.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)
        at net.snowflake.client.jdbc.internal.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
        at net.snowflake.client.jdbc.internal.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
        at net.snowflake.client.jdbc.internal.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
        at net.snowflake.client.jdbc.internal.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
        at net.snowflake.client.jdbc.internal.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
        at net.snowflake.client.jdbc.internal.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
        at net.snowflake.client.jdbc.internal.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
        at net.snowflake.client.jdbc.internal.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
        at net.snowflake.client.jdbc.internal.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
        at net.snowflake.client.jdbc.RestRequest.execute(RestRequest.java:160)
        at net.snowflake.client.core.HttpUtil.executeRequestInternal(HttpUtil.java:614)
        at net.snowflake.client.core.HttpUtil.executeRequest(HttpUtil.java:559)
        at net.snowflake.client.core.HttpUtil.executeGeneralRequest(HttpUtil.java:526)
        at net.snowflake.client.core.SessionUtil.newSession(SessionUtil.java:586)
        at net.snowflake.client.core.SessionUtil.openSession(SessionUtil.java:284)
        at net.snowflake.client.core.SFSession.open(SFSession.java:446)
        - locked <381ec49c> (a net.snowflake.client.core.SFSession)
        at net.snowflake.client.jdbc.DefaultSFConnectionHandler.initialize(DefaultSFConnectionHandler.java:104)
        at net.snowflake.client.jdbc.DefaultSFConnectionHandler.initializeConnection(DefaultSFConnectionHandler.java:79)
        at net.snowflake.client.jdbc.SnowflakeConnectionV1.initConnectionWithImpl(SnowflakeConnectionV1.java:116)
        at net.snowflake.client.jdbc.SnowflakeConnectionV1.<init>(SnowflakeConnectionV1.java:96)
        at net.snowflake.client.jdbc.SnowflakeDriver.connect(SnowflakeDriver.java:164)
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359)
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201)
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470)
        at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:733)
        at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:712)
        at java.base@11.0.16/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base@11.0.16/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base@11.0.16/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base@11.0.16/java.lang.Thread.run(Thread.java:829)
Locked ownable synchronizers:
        - locked <5c5da1e> (a java.util.concurrent.ThreadPoolExecutor$Worker)

        - locked <761970bf> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

系统监控截图

线程数量监控趋势图
内存使用情况监控图
线程详情统计图表

内容的提问来源于stack exchange,提问作者user1926248

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:01:16