Quarkus调用Oracle存储过程无响应需手动中断的问题排查求助
问题排查与解决方案
核心问题原因
- 依赖冲突:同时引入Quarkus官方
quarkus-jdbc-oracle和适配JDK1.4的旧版ojdbc14:9.2.0.1驱动,二者本身存在兼容性问题,且ojdbc14和Quarkus 2.x要求的JDK11+运行环境不匹配,是调用存储过程卡住的核心诱因。 - 数据源配置冲突:全局配置了
quarkus.datasource.jdbc.driver=io.opentracing.contrib.jdbc.TracingDriver,但命名数据源ORACLEDB单独配置了Oracle原生驱动,驱动优先级混乱导致链路追踪驱动和旧版Oracle驱动交互异常,执行存储过程时出现阻塞。 - 代码逻辑错误:将
List<ConfirmaFacilidadeCompletaOutput>类型的集合对象直接强转为实体类调用set方法,会抛出ClassCastException,异常仅被打印未向上抛出,结合驱动层阻塞导致请求无响应。 - 存储过程本身问题:不排除存储过程本身存在锁等待、全表扫描等慢执行问题,导致调用耗时超过30分钟。
修复方案
- 修复依赖冲突
移除ojdbc14依赖,quarkus-jdbc-oracle已内置官方Oracle驱动。如果必须兼容Oracle 9.2.0.1版本,需要先排除Quarkus自带的高版本ojdbc驱动,再引入对应适配版本,同时添加Oracle 9i兼容配置。 - 修正数据源配置
删除全局的TracingDriver配置,或者给命名数据源配置适配的链路追踪驱动,避免驱动优先级混乱:
# 可选方案1:删除全局链路追踪驱动配置,所有数据源使用各自配置的原生驱动 # quarkus.datasource.jdbc.driver=io.opentracing.contrib.jdbc.TracingDriver # 可选方案2:给ORACLEDB数据源配置链路追踪驱动 quarkus.datasource.ORACLEDB.jdbc.driver=io.opentracing.contrib.jdbc.TracingDriver quarkus.datasource.ORACLEDB.jdbc.additional-jdbc-properties.driver=oracle.jdbc.driver.OracleDriver
- 修正DAO代码错误
不要将集合对象强转为实体类,正确的赋值逻辑如下:
List<ConfirmaFacilidadeCompletaOutput> outPut = new ArrayList<>(); // 新建实体对象赋值后加入集合 ConfirmaFacilidadeCompletaOutput item = new ConfirmaFacilidadeCompletaOutput(); item.setRetornoFuncao(callableStatement.getInt(1)); item.setVrRetorno(callableStatement.getString(9)); item.setCodRetorno(callableStatement.getString(10)); outPut.add(item); return outPut;
- 添加JDBC调用超时限制
给存储过程调用设置查询超时时间,避免长时间阻塞线程:
// 执行前设置超时时间,单位为秒,以下为2分钟超时 callableStatement.setQueryTimeout(120); callableStatement.execute();
- 数据库侧验证
在Oracle客户端使用相同入参直接调用该存储过程,确认存储过程本身的执行耗时,排查是否存在锁等待、慢查询等问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

