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的重新初始化。
解决方案
- 移除冗余依赖和配置
首先删除pom.xml里的c3p0依赖:
<dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency>
同时删除application.properties和additionalProperties()方法里所有hibernate.c3p0开头的配置项。
- 优先使用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
- 必须保留自定义配置类的修改方案
如果你确实需要自定义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开头的配置项,避免无效配置干扰。
- 端口占用问题排查
如果修改后仍然偶现3306端口占用,执行命令检查本地3306端口占用进程:
- Windows系统执行:
netstat -ano | findstr :3306 - Linux/Mac系统执行:
lsof -i:3306
关闭占用端口的多余进程,或者确认数据库服务正常运行在3306端口即可。
内容的提问来源于stack exchange,提问作者Barazanthul
相关产品推荐
相关产品推荐

