Quarkus/Hibernate REST API无法获取JDBC连接问题求解
问题现象
Quarkus/Hibernate REST API启动正常,但通过Swagger-UI触发登录流程调用登录API时,抛出以下异常:
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection
Caused by: java.sql.SQLRecoverableException: Erreur d'E/S: The Network Adapter could not establish the connection
2022-11-15 14:03:18,857 WARN (Agroal_2230584771) Datasource 'default': Erreur d'E/S: The Network Adapter could not establish the connection
数据库URL配置为:jdbc:oracle:thin:@bodswv092:1521:DEMO
排查与解决步骤
验证网络连通性
- 在应用服务器上执行
ping bodswv092,确认数据库服务器是否可达。如果无响应,排查网络防火墙规则、路由配置或数据库服务器是否在线。 - 测试数据库端口是否开放:执行
telnet bodswv092 1521或nc -zv bodswv092 1521,若连接失败,需确认数据库服务器的1521端口是否被防火墙拦截,或Oracle监听服务未运行。
- 在应用服务器上执行
检查数据库URL格式正确性
Oracle Thin驱动支持两种URL格式:- SID格式:
jdbc:oracle:thin:@host:port:SID - 服务名格式:
jdbc:oracle:thin:@//host:port/service_name
如果DEMO是数据库服务名而非SID,需将URL修改为jdbc:oracle:thin:@//bodswv092:1521/DEMO。可通过以下SQL在数据库端确认:
-- 查询SID SELECT name FROM v$database; -- 查询服务名 SELECT value FROM v$parameter WHERE name='service_names';- SID格式:
确认数据库实例与监听状态
在数据库服务器上执行:lsnrctl status:检查Oracle监听服务是否正常运行,且是否包含DEMO实例的监听配置。- 登录数据库执行
SELECT status FROM v$instance;,确认实例状态为OPEN。若实例未启动,执行startup启动实例。
核对Quarkus数据源配置
检查application.properties(或application.yml)中的数据库配置:- 确认用户名、密码是否正确,无拼写错误。
- 若数据库启用SSL连接,需添加对应配置属性,例如:
quarkus.datasource.jdbc.additional-jdbc-properties.oracle.net.ssl_server_dn_match=true quarkus.datasource.jdbc.additional-jdbc-properties.oracle.net.ssl_version=1.2 - 检查Agroal连接池配置,确保
quarkus.datasource.jdbc.min-size、quarkus.datasource.jdbc.max-size等参数设置合理,避免连接池耗尽。
验证JDBC驱动兼容性
确认使用的Oracle JDBC驱动版本与数据库版本匹配:- Oracle 11g对应ojdbc6,12c/18c/19c对应ojdbc8,21c对应ojdbc11。
在Quarkus的pom.xml中检查依赖:
<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <scope>runtime</scope> </dependency>- Oracle 11g对应ojdbc6,12c/18c/19c对应ojdbc8,21c对应ojdbc11。
内容的提问来源于stack exchange,提问作者VenomBerry

