... 43 more Caused by: org.datanucleus.exceptions.NucleusException: Attempt to invoke the "HikariCP" plugin to create a ConnectionPool gave an error : Failed to initialize pool: Public Key Retrieval is not allowed at org.datanucleus.store.rdbms.ConnectionFactoryImpl.generateDataSources(ConnectionFactoryImpl.java:232) at org.datanucleus.store.rdbms.ConnectionFactoryImpl.initialiseDataSources(ConnectionFactoryImpl.java:117) at org.datanucleus.store.rdbms.ConnectionFactoryImpl.<init>(ConnectionFactoryImpl.java:82) ... 59 more Caused by: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: Public Key Retrieval is not allowed
时间: 2025-07-09 14:56:56 浏览: 2
<think>好的,我现在需要解决用户遇到的HikariCP连接池初始化失败的问题,错误是“Public Key Retrieval is not allowed”。首先,我得理解这个错误的原因。根据用户提供的引用信息,这个错误通常与MySQL的安全设置有关,特别是MySQL 8.0及以上版本默认启用了更严格的安全措施,导致JDBC连接时不允许公钥检索[^3][^5]。
接下来,我需要回忆一下HikariCP的配置方式。用户提到HikariCP是Spring Boot的默认连接池,即使没有显式配置也会使用[^1]。所以,用户可能是在Spring Boot项目中遇到了这个问题,而没有对连接池进行额外设置。
根据引用中的解决方法,通常需要将驱动属性allowPublicKeyRetrieval设置为true[^4]。在DBeaver中,用户可以直接在驱动属性里修改这个参数,但在HikariCP中,应该通过配置参数来实现。那么,我需要确定如何在Spring Boot的配置文件中添加这个参数。
Spring Boot的数据源配置通常是在application.properties或application.yml文件中进行的。对于MySQL JDBC URL,正确的参数附加方式是在连接字符串后面加上allowPublicKeyRetrieval=true。例如:
jdbc:mysql://localhost:3306/dbname?allowPublicKeyRetrieval=true&useSSL=false
这里可能还需要考虑SSL的设置,因为有时候SSL配置不正确也会导致连接问题。不过用户的主要错误是公钥检索不允许,所以重点应该放在allowPublicKeyRetrieval参数上。
另外,检查用户是否使用了正确的MySQL驱动版本。MySQL 8.0以上需要使用较新的驱动,比如mysql-connector-java 8.0.x。如果驱动版本过旧,可能不支持某些参数,导致问题依旧存在。
还需要确认用户是否在配置中正确设置了其他必要的参数,比如用户名、密码、时区设置(serverTimezone)等。这些参数缺失或错误也可能引发连接问题,但当前错误信息明确指向公钥检索,所以优先处理allowPublicKeyRetrieval。
总结步骤应该是:修改JDBC URL,添加allowPublicKeyRetrieval=true,并确保驱动版本正确。同时,检查其他相关配置,如SSL和时区设置,以排除其他潜在问题。</think>### 解决方案:HikariCP连接池初始化失败(Public Key Retrieval is not allowed)
#### 问题原因分析
该错误是由于MySQL 8.0及以上版本默认启用了严格的安全策略,禁止JDBC客户端通过明文方式传输公钥[^3]。HikariCP作为Spring Boot默认连接池,若未显式配置`allowPublicKeyRetrieval=true`,会触发此异常[^1]。
---
#### 逐步解决方法
1. **修改JDBC连接参数**
在`application.properties`或`application.yml`中,为MySQL连接URL添加以下参数:
```properties
# application.properties示例
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
```
- `allowPublicKeyRetrieval=true`:允许公钥检索[^5]
- `useSSL=false`:若未启用SSL证书则需关闭(生产环境建议启用)
- `serverTimezone=UTC`:避免时区不一致导致的连接异常
2. **检查MySQL驱动版本**
确保`pom.xml`或`build.gradle`中使用的驱动版本为**MySQL 8.0+兼容版本**:
```xml
<!-- Maven示例 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
```
3. **验证完整配置**
```properties
# 完整配置示例
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
```
4. **重启应用**
修改后重新启动Spring Boot应用,观察连接池初始化是否成功。
---
#### 扩展验证
- **日志排查**:启用HikariCP日志可定位具体错误阶段:
```properties
logging.level.com.zaxxer.hikari=DEBUG
```
- **手动注入数据源**(可选)
若默认配置不生效,可显式定义数据源Bean:
```java
@Bean
public DataSource dataSource() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/your_database?allowPublicKeyRetrieval=true");
config.setUsername("root");
config.setPassword("your_password");
return new HikariDataSource(config);
}
```
---
阅读全文
相关推荐


















