`
anreddy
  • 浏览: 99209 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JDBC游标超过限制出现ORA-01000的问题

阅读更多

关键字: jdbc游标超过限制出现ora-01000的问题
最近一个项目测试时经常出这个错,应该是jdbc问题,但不是连接未关闭导致达到最大连接数,因为这是oracle数据库报错,说明已经连上数据库,估计是某些程序中statement未关闭。以下是网络上关于这个问题的帖子:


[TIP]关于Java开发中使用Oracle数据库的一点注意事项

很多朋友在Java开发中,使用Oracle数据库的时候,经常会碰到有ORA-01000: maximum open cursors exceeded.的错误。

实际上,这个错误的原因,主要还是代码问题引起的。
ora-01000: maximum open cursors exceeded.
表示已经达到一个进程打开的最大游标数。

这样的错误很容易出现在Java代码中的主要原因是:Java代码在执行conn.createStatement()和 conn.prepareStatement()的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,如果你的 createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。

一般来说,我们在写Java代码的时候,createStatement和prepareStatement都应该要放在循环外面,而且使用了这些Statment后,及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后,如果不需要使用结果集(ResultSet)的数据,就马上将Statment关闭。

对于出现ORA-01000错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本。实际上,代码中的隐患并没有解除。
而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常特别的要求。

---

如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。

但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和 ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。

---
这个关不关和使用不使用conn pool没有关系,一般操作是会是这样,线程从外界获取一个conn,然后创建自己地stmt,rs,然后执行逻辑操作,然后将conn返回给pool。如果程序员忘记手动关地话。当这个线程执行完以后,stmt,rs都成垃圾,当他们被垃圾搜集地时候,gc会替我们把它们给关闭地。这就是很多代码没有关闭,仍然正常运行。
但是这样会有一个潜在地问题。就是gc无法确定什么时候运行。如果free地内存很多,很可能有些gc就不会被启动,这样stmt迟迟没有被关闭,执行一段时间会报错。
所以健壮地代码应该手工把rs,stmt都关闭
分享到:
评论

相关推荐

    oracle+ora-各种常见java.sq

    - `java.sql.SQLException: ORA-01000: maximum open cursors exceeded`: 当打开的游标超过数据库允许的最大值时会出现此错误。检查代码中游标的关闭情况,避免资源泄漏。 8. **锁冲突** - `java.sql....

    oracle 错误合集

    **ORA-17092**:无法本地执行 JDBC 错误,可能是因为 JDBC 配置或连接问题。 **ORA-17093**:OCI 成功但带信息错误,通常是因为 OCI 操作成功但带有警告信息。 **ORA-17094**:部分完成错误,可能是因为操作部分...

    oracle errors (oracle 错误)

    ORA-01002错误通常出现在尝试引用一个未打开的游标时。这意味着在执行SELECT语句之前,可能未正确初始化游标。在PL/SQL中,通常需要显式声明和打开游标,然后才能从中获取数据。如果是在SQL*Plus或类似的工具中执行...

    Oracle 存储过程JAVA调用存储过程 游标使用

    这篇博客可能详细讨论了如何在Java中与Oracle存储过程交互,特别是涉及到了游标的使用。 首先,让我们理解存储过程的概念。存储过程是一组预先编译的SQL语句,可以接受参数,执行复杂操作,然后返回结果。在Oracle...

    Oracle面试题

    在实际应用中,比如JDBC查询,代码示例展示了如何连接Oracle数据库、执行查询、处理结果集并确保资源正确释放。在面试中,对这些核心概念的理解和实际操作经验都是考察的关键点。理解并熟练运用这些知识点,有助于...

    oracle数据库jdbc驱动

    在使用Oracle JDBC驱动时,开发者首先需要在项目中引入对应的jar包,例如"ora_driver.jar"就是Oracle JDBC驱动的库文件。接着,创建数据库连接通常通过以下步骤: 1. 加载驱动:`Class.forName("oracle.jdbc.driver...

    jdbc基础和参考

    jdbc: 1.数据库连接的方式: ODBC:开放式数据库连接。 C语言实现的,提供语言和(基于SQL的)数据库进行交互的“一致性”的接口 JDBC:java版本的ODBC JDBC连接数据库的步骤: 1.注册驱动(加载驱动): 注册...

    Oracle API

    7. ORA-Error Codes:Oracle数据库在遇到错误时会返回一个错误代码(如ORA-00001,表示违反唯一性约束),这些错误代码及其对应的解释是调试和解决Oracle数据库问题的重要参考。 在实际开发中,理解并熟练运用这些...

    instantclient-basic-nt-windows.x32-12.2.0.1.0

    7. **性能优化**:Oracle Instant Client包含了一些性能优化特性,如本地游标缓存、并行执行等,以提高数据访问速度和效率。 8. **零配置**:安装后,Oracle Instant Client通常不需要额外的配置步骤,即可开始使用...

    Java中通过jdbc(thin方式)连接Oracle数据库程序示例实用.pdf

    - `url`参数指定了数据库连接的信息,包括协议(`jdbc`)、子协议(`oracle:thin`)、主机名(`localhost`)、端口号(`1521`)以及数据库的SID(`ora92`)。 - `DriverManager.getConnection()`方法用于获取...

    oracle install client.zip

    - 版本兼容性:检查Instant Client与目标Oracle数据库服务器的版本兼容性,避免出现不兼容问题。 - 更新维护:及时更新Instant Client以获取最新的安全补丁和功能增强。 6. **ODBC与JDBC驱动**: - ODBC(Open ...

    oracle-instantclient19.19

    Oracle Instant Client 19.19支持的功能包括但不限于:连接管理、事务处理、游标、预编译语句、PL/SQL执行、数据库链接、并发控制、性能优化等。它广泛应用于各种场景,如Web应用、数据迁移、报表生成、数据分析等,...

    instantclient-21-9

    - JDBC:对于Java开发者,可以通过JDBC驱动程序与Oracle Instant Client交互。 5. **性能优化**: - 使用 thin client 模式,避免了中间网络层,提高了通信效率。 - 利用OCI的高级特性,如绑定变量、批处理等,...

    ojdbc-11.2.0.4含orai18n.zip

    Oracle JDBC驱动程序是Java应用程序与Oracle数据库之间通信的桥梁,ojdbc6-11.2.0.4.jar是Oracle数据库11g Release 2的一个关键组件,它提供了JDBC接口,使得Java开发者能够访问和操作Oracle数据库。ojdbc6指的是...

    oracle-instantclient-basic-windows.x64-12.1.0.2.0

    5. **instantclient_12_1**:这个目录可能包含了Oracle Instant Client的其他组件,如OCCI(Oracle Call Interface for C++)、JDBC驱动、ODBC驱动等,这些使得不同语言的应用程序都能与Oracle数据库通信。...

    如何利用Oracle命令解决函数运行错误

    预定义异常是Oracle系统自动引发的,如ORA-0001(违反唯一性限制)和ORA-1403(没有找到数据)。非预定义异常则需要在程序中定义并显式引发,例如用户自定义的异常。 异常处理语句的结构如下: ```sql BEGIN -- ...

    Oracle官方32位客户端-instantclient-basic-nt-12.1.0.2.0

    4. **版本兼容性**: 需要确保客户端版本与目标Oracle数据库服务器版本兼容,以避免可能出现的不兼容问题。 Oracle Instant Client的32位版本特别适用于那些仍在运行32位应用程序的环境,它可以提供无缝的数据库访问...

    oracl培训文件

    - **警告日志文件**:通常为 `alertaccp.log` 或 `alertaccp.ora` 文件,用于记录Oracle数据库运行过程中的错误和警告信息。 #### 七、性能调优与故障排查 - **内存结构**:理解Oracle的SGA(共享全局区)和PGA...

    面试Oracle没问题只要做会i这些题

    - JDBC(Java Database Connectivity):Java程序连接Oracle的方法。 - ODBC(Open Database Connectivity):通用的数据库访问接口。 10. **故障诊断** - ORA错误:识别并解决常见的Oracle错误代码。 - 日志...

    instantclient-basic-win32-11.2.0.1.0.rar

    - 游标管理:允许应用程序处理多行结果集,实现高效的批量处理。 - 其他功能:包括绑定变量、事务管理、错误处理和性能优化等。 2. **Windows 32位系统支持**: 这个版本是专为32位Windows操作系统设计的,确保...

Global site tag (gtag.js) - Google Analytics