You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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分钟。

修复方案

  1. 修复依赖冲突
    移除ojdbc14依赖,quarkus-jdbc-oracle已内置官方Oracle驱动。如果必须兼容Oracle 9.2.0.1版本,需要先排除Quarkus自带的高版本ojdbc驱动,再引入对应适配版本,同时添加Oracle 9i兼容配置。
  2. 修正数据源配置
    删除全局的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
  1. 修正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;
  1. 添加JDBC调用超时限制
    给存储过程调用设置查询超时时间,避免长时间阻塞线程:
// 执行前设置超时时间,单位为秒,以下为2分钟超时
callableStatement.setQueryTimeout(120);
callableStatement.execute();
  1. 数据库侧验证
    在Oracle客户端使用相同入参直接调用该存储过程,确认存储过程本身的执行耗时,排查是否存在锁等待、慢查询等问题。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:21:00