关键字: 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都关闭
分享到:
相关推荐
本文对ORA-01000_maximum_open_cursors_exceeded_超出打开游标的最大数的原因和解决方案有详细描述
游标卡尺行业(2021-2026)企业市场突围战略分析与建议.docx
实验6 存储过程、存储函数和游标-软工2111-雷靖彤.doc
ora-exploits-evilcursor Oracle Evil 游标注入漏洞利用存储库 - Perl 和 SQL 版本SQL bunkerview.sql ctxsys-drvxtabc-create_tablesV2.sql dbms_cdc_subscribeV2.sql dbms_meta_get_ddlV2.sql kupm...
解决疑难问题,针对偏僻的问题:oracle超出打开游标的最大数的原因和解决方案,希望能对大家操作数据库有用处
主要介绍了SQL Server使用游标处理Tempdb究极竞争-DBA问题-程序员必知的相关资料,需要的朋友可以参考下
主要介绍了JDBC使用游标实现分页查询的方法,实例分析了jdbc查询过程中游标的使用及查询分页相关实现技巧,需要的朋友可以参考下
游标 ms sql 例子----- 大概模式 临时表使用等-——---
游标与全文检索;PPT 授课电子讲义
虽然游标能做的事,也可以利用DELPHI的while not qry1.Eof do...来完成,但学学还有有用的。 我想在数据库里实现循环应该比在程序里实现来得快吧? 高手莫入。
Oracle Exception汇总(自定义Oracle异常) 使用方法举例: Exception When no_data_found ...重新打开已经打开的游标。对应ORA-06511错误。 DUP_VAL_ON_INDEX 在惟一索引所对应的列上键入重复值。对应ORA-00001错误。
jdbcTemplate分页彻底解决,使用游标滚动jdbcTemplate分页彻底解决,使用游标滚动
大量源码案例,手把手教你PLSQL数据库开发。...---- 第五章 PL/SQL游标 ---- ---- 第六章 HANDLE EXCEPTION ---- ---- 第七章 SUB PROGRAM ---- ---- 第八章 PACKAGE ---- ---- 第九章 TRIGGER ----
JDBC通信原理 JDBC驱动类型 JDBC构成 JDBC程序5步走 滚动的结果集 可更新的结果集 SQL数据类型对应的Java类型 事务及批量处理 行集、连接池、LDAP
sql server 游标 使用的使用方法 --读取数据(使用FETCH来获取该记录的值;FETCH会执行两步操作:首先将游标当前指向的记录保存到一个局部变量中, --然后游标将自动移向下一条记录) --将一条或多条记录读入某个...
--以下是把批号拆分的游标 declare @EntryID int --定义变量行号 declare @BillNo varchar(100) --定义变量单据号 declare @Number varchar(100) --定义变量物料代码 declare @qty decimal(18,6) --定义变量数量 ...
Transact-SQL语言极其程序设计的方法; T-SQL游标的使用方法。
游标卡尺螺旋测微器-电流表电压表读数.ppt