如何替换Hibernate默认连接池为HikariCP以解决连接耗尽问题
核心问题根源
你自定义的返回PGSimpleDataSource的DataSource Bean优先级高于Spring Boot的自动DataSource配置,这是你之前所有配置不生效、以及出现连接池耗尽报错的核心原因:
PGSimpleDataSource没有连接池能力,每次请求都会新建物理连接,并发稍高就会出现连接耗尽,直接触发你遇到的报错- Spring Boot默认会优先使用开发者自定义的DataSource Bean,自动装配逻辑完全失效,所以你修改
spring.datasource.type等配置都不会生效
解决方案
方案一(推荐):删除自定义DataSource Bean
Spring Boot 2.x及以上版本默认集成HikariCP,只要引入了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖,删除你自定义的返回PGSimpleDataSource的Bean后,框架会自动装配Hikari连接池。
你只需要在配置文件中保留基础数据源配置即可:
spring: datasource: url: jdbc:postgresql://<数据库地址>:5432/<库名> username: <数据库用户名> password: <数据库密码> driver-class-name: org.postgresql.Driver # Hikari连接池可选配置,可根据业务调整参数 hikari: minimum-idle: 5 maximum-pool-size: 20 idle-timeout: 30000 connection-timeout: 30000
properties格式示例:
spring.datasource.url=jdbc:postgresql://<数据库地址>:5432/<库名> spring.datasource.username=<数据库用户名> spring.datasource.password=<数据库密码> spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.maximum-pool-size=20
方案二:保留自定义Bean,修改为返回HikariDataSource
如果你确实需要手动定义DataSource Bean,修改配置类代码如下:
@Configuration public class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") public DataSource dataSource() { return new HikariDataSource(); } }
对应配置文件写法为:
spring: datasource: hikari: jdbc-url: jdbc:postgresql://<数据库地址>:5432/<库名> username: <数据库用户名> password: <数据库密码> driver-class-name: org.postgresql.Driver minimum-idle: 5 maximum-pool-size: 20
验证是否生效
项目启动后,查看日志会出现类似HikariPool-1 - Start completed.的输出,即可确认HikariCP已成功替换原有连接池。
内容的提问来源于stack exchange,提问作者Harsha Limaye
相关产品推荐
相关产品推荐

