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

Spring Boot+JPA无法获取独立JDBC连接及启动端口占用问题咨询

问题根因分析
  • 你自定义的DataSource使用了DriverManagerDataSource,这并非池化数据源,每次请求数据库都会新建物理JDBC连接,没有复用机制,并发操作时会快速耗尽连接资源和本地端口,直接导致unable to obtain isolated JDBC connection以及Address already in use报错。
  • Spring Boot默认使用Hikari连接池,你同时引入了c3p0依赖,且同时配置了两套连接池参数,配置冲突导致没有生效的池化策略。
  • 你将Hikari的配置参数错误写入了JPA的additionalProperties中,Hikari连接池的配置不会从JPA属性中读取,再加上你自定义了DataSource覆盖了Spring Boot自动装配的Hikari数据源,导致application.properties里的所有Hikari配置完全不生效。
  • 应用关闭时触发EntityManager创建的问题是因为自定义配置的Bean生命周期管理不规范,事务管理器、实体管理器工厂和数据源的依赖绑定逻辑有问题,销毁阶段顺序异常触发了Bean的重新初始化。
解决方案
  1. 移除冗余依赖和配置
    首先删除pom.xml里的c3p0依赖:
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.5</version>
</dependency>

同时删除application.properties和additionalProperties()方法里所有hibernate.c3p0开头的配置项。

  1. 优先使用Spring Boot自动装配(推荐)
    如果你没有特殊的自定义需求,直接删除整个PersistenceJPAConfig类里的dataSource()、entityManagerFactory()、transactionManager()方法,所有数据库配置写到application.properties中,Spring Boot会自动装配Hikari连接池、实体管理器和事务管理器,配置示例如下:
# 数据源基础配置
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/DB?autoReconnect=true&useUnicode=true&characterEncoding=utf8
spring.datasource.username=XXXX
spring.datasource.password=XXXXXXXX
# Hikari连接池配置(自动生效)
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.connectionTimeout=30000   
spring.datasource.hikari.idleTimeout=600000          
spring.datasource.hikari.maxLifetime=1800000
# JPA配置
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
  1. 必须保留自定义配置类的修改方案
    如果你确实需要自定义JPA配置,把dataSource()方法的返回值改为Hikari池化数据源,正确注入配置:
@Bean
public DataSource dataSource(){
    HikariConfig config = new HikariConfig();
    config.setDriverClassName("org.mariadb.jdbc.Driver");
    config.setJdbcUrl("jdbc:mysql://localhost:3306/DB?autoReconnect=true");
    config.setUsername( "XXXX" );
    config.setPassword( "XXXXXXXX" );
    // 手动配置连接池参数
    config.setMaximumPoolSize(10);
    config.setConnectionTimeout(30000);
    config.setIdleTimeout(600000);
    config.setMaxLifetime(1800000);
    return new HikariDataSource(config);
}

同时删除additionalProperties()方法里所有spring.datasource.hikari开头的配置项,避免无效配置干扰。

  1. 端口占用问题排查
    如果修改后仍然偶现3306端口占用,执行命令检查本地3306端口占用进程:
  • Windows系统执行:netstat -ano | findstr :3306
  • Linux/Mac系统执行:lsof -i:3306
    关闭占用端口的多余进程,或者确认数据库服务正常运行在3306端口即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:48:03