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

Spring Boot关闭时UCP PoolDataSource连接池关闭问题咨询

解决Spring Boot关闭时UCP连接池的关闭问题

由于PoolDataSource本身没有提供直接的close()方法,你可以通过以下几种方式实现Spring Boot应用关闭时优雅关闭UCP连接池:

方法1:通过UniversalConnectionPoolManager关闭所有连接池

UCP提供了UniversalConnectionPoolManager类来统一管理所有连接池实例,借助Spring的销毁回调触发关闭操作:

import oracle.ucp.UniversalConnectionPoolManager;
import oracle.ucp.UniversalConnectionPoolManagerImpl;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PreDestroy;

@Configuration
public class UcpPoolShutdownConfig {

    @PreDestroy
    public void shutdownUcpPool() {
        try {
            UniversalConnectionPoolManager manager = UniversalConnectionPoolManagerImpl.getUniversalConnectionPoolManager();
            // 关闭所有已注册的UCP连接池
            manager.shutdown();
        } catch (Exception e) {
            // 可替换为项目日志组件记录异常
            e.printStackTrace();
        }
    }
}

方法2:针对指定PoolDataSource实例关闭连接池

如果需要单独关闭某个特定的连接池,可以通过PoolDataSource获取对应的连接池实例执行关闭:

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.UniversalConnectionPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PreDestroy;

@Configuration
public class UcpPoolShutdownConfig {

    @Autowired
    private PoolDataSource poolDataSource;

    @PreDestroy
    public void shutdownSpecificPool() {
        try {
            UniversalConnectionPool ucp = poolDataSource.getConnectionPool();
            if (ucp != null) {
                ucp.shutdown();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方法3:实现Spring的DisposableBean接口触发关闭

若偏好通过Spring接口规范实现,可使用DisposableBean:

import oracle.ucp.jdbc.PoolDataSource;
import oracle.ucp.UniversalConnectionPool;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UcpPoolDisposer implements DisposableBean {

    @Autowired
    private PoolDataSource poolDataSource;

    @Override
    public void destroy() throws Exception {
        UniversalConnectionPool ucp = poolDataSource.getConnectionPool();
        if (ucp != null) {
            ucp.shutdown();
        }
    }
}

核心说明

  • 所有方法均利用Spring的生命周期回调机制,在应用上下文关闭时自动触发连接池关闭逻辑。
  • UniversalConnectionPool.shutdown()会优雅释放连接池持有的所有数据库连接及相关资源。
  • 建议使用最新稳定版UCP依赖,避免API兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:22:04