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

Spring Boot集成Oracle用JdbcTemplate报ORA-01000最大打开游标超出异常求助

解决方案

  1. 修正UCP连接池配置错误
    你当前配置的connectionFactoryClassName参数值有误,UCP连接池需使用专用的连接工厂实现才能正确接管资源生命周期,修改配置如下:
platform: oracle
url: jdbc:oracle:thin:@localhost:1521:TEST
# 替换原错误的连接工厂类
connectionFactoryClassName: oracle.ucp.jdbc.PoolDataSourceImpl
fastConnectionFailoverEnabled: true
username: test
password: test
initialPoolSize: 3
minPoolSize: 0
maxPoolSize: 12
inactivityTimeout: 300
queryTimeout: 600
validateConnectionOnBorrow: true
# 新增以下两个配置回收statement避免游标泄漏
maxStatements: 100
closeStatementOnConnectionRelease: true
  1. 修正ResultSet取值索引错误
    JDBC规范中ResultSet的列索引从1开始计数,你代码中rs.getString(0)会抛出数组越界异常,异常场景会打断Spring的资源回收逻辑,导致statement、ResultSet未正常关闭进而泄漏游标。修改为对应列的1开始的序号,或直接使用列名取值更稳妥:
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
    // 例如列名为id就写rs.getString("id"),或序号从1开始
    return rs.getString(1);
}
  1. 添加ojdbc与Spring版本兼容参数
    ojdbc 21.x版本的ParameterMetaData实现与Spring Boot 2.3.x存在兼容问题,Spring调用参数元数据接口时会触发ojdbc额外创建游标查询元数据且不会主动关闭,除已配置的spring.jdbc.getParameterType.ignore=true外,添加以下两个JVM启动参数:
-Doracle.jdbc.getObjectReturnsStringForOtherTypes=true
-Dspring.jdbc.oracle.parameterMetaDataDisabled=true
  1. 临时缓解方案
    如果需要先恢复业务,可让DBA执行SQL调大Oracle最大打开游标数(治标不治本,需配合上面的修改根治):
alter system set open_cursors=1000 scope=both;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:27:07