ORA-01000本质是会话级游标泄漏,主因是Java代码中Statement/PreparedStatement未显式关闭,连接池归还Connection不释放游标;必须用try-with-resources按ResultSet→Statement→Connection顺序关闭,禁用语句缓存并优先修复代码而非调大open_cursors。
ora-01000 不是数据库配得太小,而是你的 java 代码在反复打开 statement 或 preparedstatement 后没关——哪怕连接池把 connection 收回去了,游标还挂在会话上不释放。
为什么 close(Connection) 不等于关游标
连接池(如 HikariCP、Druid)的 close() 只是归还物理连接,不是销毁会话。Oracle 每个会话的游标资源独立维持,Statement 和 ResultSet 必须显式关闭,否则游标句柄一直占用。
- 错误写法:
stmt = conn.createStatement()在循环里反复 new,只在 finally 里 close 一次 —— 实际只关了最后一个 - 更隐蔽的坑:用了语句缓存(
statementCacheSize > 0),close()只是放回缓存,不是释放游标 - 查证方式:连 DBA 账号执行
SELECT COUNT(*) FROM v$open_cursor WHERE sid = ?,看单个会话是否持续增长
必须用 try-with-resources 包住三层资源
Connection、PreparedStatement、ResultSet 都要各自独立包裹,不能只包外层。
- 正确结构:
try (Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery()) { while (rs.next()) { /* 处理 */ } } // 三者在此处按逆序自动 close() - 别复用
PreparedStatement实例去执行不同 SQL —— 参数类型或数量变化会导致隐式游标残留 - 批量插入别用循环 + 单条
executeUpdate(),改用addBatch()+executeBatch()
禁用语句缓存快速验证是不是它惹的祸
很多框架(如 WebLogic 默认 200)、Oracle JDBC 驱动(oracle.jdbc.pool.OracleDataSource)默认开启语句缓存,这是 ORA-01000 的高发区。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 临时禁用:在连接 URL 加
;statementCacheSize=0(JDBC Thin)或设置setStatementCacheSize(0)(UCP) - Spring Boot 用户可在
application.yml中加:spring: datasource: hikari: data-source-properties: statementCacheSize: 0 - 禁用后若问题消失,说明原缓存配置过大(比如设成 50 就够大部分场景用,别盲目留 200)
调大 open_cursors 是最后手段,且必须配合监控
DBA 执行 ALTER SYSTEM SET open_cursors = 1000 SCOPE=BOTH 能热生效,但掩盖的是代码缺陷。
- 生产环境安全值通常为 800~1200;设到 5000 以上容易引发 PGA 内存压力
- 调参后必须同步查
v$sesstat中opened cursors current峰值,确认是否真有业务需要这么多并发游标 - 如果某会话长期持有 >200 个游标,大概率是代码漏关
ResultSet,尤其在异常分支或提前 return 前
最常被忽略的一点:ResultSet.close() 不是可选操作,它和 PreparedStatement.close() 一样,缺一不可。哪怕你只读一行就 break,也得确保 rs 被释放 —— Oracle 不会因为你没读完就自动回收游标。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










