Spring Boot集成Oracle用JdbcTemplate报ORA-01000最大打开游标超出异常求助
解决方案
- 修正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
- 修正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); }
- 添加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
- 临时缓解方案
如果需要先恢复业务,可让DBA执行SQL调大Oracle最大打开游标数(治标不治本,需配合上面的修改根治):
alter system set open_cursors=1000 scope=both;
内容的提问来源于stack exchange,提问作者bvu
相关产品推荐
相关产品推荐

