ora-01000 是因 java 代码中 statement/preparedstatement 创建后未显式关闭导致的游标泄漏,而非数据库参数配置过小;需通过 v$open_cursor 确认泄漏、检查 open_cursors 上限,并用 try-with-resources 强制关闭资源。

ORA-01000 不是数据库配小了,而是 Java 代码里 Statement 或 PreparedStatement 创建了却没关——哪怕连接池把 Connection 归还了,游标还在 Oracle 会话里挂着。
查当前会话游标数:别猜,直接看 v$open_cursor
先确认是不是真泄漏,而不是参数太小。用 DBA 账号或有权限的账号连库执行:
SELECT COUNT(*) FROM v$open_cursor WHERE sid = (SELECT sid FROM v$mystat WHERE rownum = 1);
再查上限:
SHOW PARAMETER open_cursors;
- 如果返回值接近甚至等于
open_cursors(比如 298/300),说明确实快满了 - 如果这个数在批量任务运行中持续上涨,基本锁定是代码泄漏
- 注意:
v$open_cursor是会话级视图,不同连接可能差异很大;别只查一个 SID 就下结论
定位泄漏点:循环里反复 prepareStatement() 却没 close()
这是最常见、最高危的写法。典型错误模式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
for (String id : ids) {
PreparedStatement ps = conn.prepareStatement("SELECT * FROM t WHERE id = ?");
ps.setString(1, id);
ResultSet rs = ps.executeQuery();
// 忘了 rs.close() 和 ps.close()
}
- 每次循环都新建
PreparedStatement,Oracle 就多开一个游标 -
ResultSet.close()不解决游标问题,必须调ps.close() - 即使用了连接池,
conn.close()只归还连接,不会自动关掉已创建的PreparedStatement - 别指望 GC —— 游标是 Oracle 服务端资源,和 Java 堆无关
用 try-with-resources 强制关闭三层资源
手动 close() 容易漏,尤其在异常分支里。必须按 ResultSet → Statement → Connection 顺序关闭,JDK 7+ 的 try-with-resources 最可靠:
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM t WHERE id = ?");
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
// 处理数据
}
} // 自动按逆序 close rs → ps → conn
- 每个资源必须独立声明在
try括号里,不能复用变量名 - 别把
PreparedStatement提到方法外再传入 —— 那样try-with-resources管不到它 - 如果 SQL 不固定(比如拼接字符串),优先改用参数化查询,而不是放弃
PreparedStatement
禁用语句缓存快速验证是不是它惹的祸
很多连接池(如 WebLogic 默认、Oracle UCP)或 JDBC URL 默认开启语句缓存,close() 只是放回缓存,不是释放游标:
- 临时禁用:JDBC URL 加
;statementCacheSize=0(Thin 驱动) - HikariCP 用户可在
application.yml中加:spring.datasource.hikari.data-source-properties.statementCacheSize=0 - UCP 用户调用
setStatementCacheSize(0) - 禁用后如果 ORA-01000 消失,说明缓存机制放大了泄漏效应,但根源仍是代码没关资源
真正难排查的不是“哪里没关”,而是“谁在复用同一个 Connection 却忘了清理自己的 Statement”。连接池让这个问题藏得深,也拖得久 —— 游标不释放,会话内存就一直涨,直到某次 executeQuery 突然崩掉。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










