Chinaunix首页 | 论坛 | 博客
  • 博客访问: 970411
  • 博文数量: 358
  • 博客积分: 8185
  • 博客等级: 中将
  • 技术积分: 3751
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-15 16:27
个人简介

The views and opinions expressed all for my own,only for study and test, not reflect the views of Any Company and its affiliates.

文章分类

全部博文(358)

文章存档

2012年(8)

2011年(18)

2010年(50)

2009年(218)

2008年(64)

我的朋友

分类: Oracle

2009-04-27 17:31:16

数据库为Oracle,系统运行中,出现ORA-01000: maximum open cursors exceeded的异常。
 
可能的原因:
 
1.statement未关闭,比如在一个循环中的statement未关闭。
2.oracle的cursor不够大。
3. oracle的存储段设置太小。
 
解决办法:
 
1. 检查程序,关闭未关闭的statement。
2. 设置大点的oracle的cursor数,alter system set open_cursors=1000 spfile
3. 设置大点的存储段, ALTER TABLE tablename STORAGE( NEXT N)
 
查看cursor的sql语句为:
 
SELECT * FROM V$OPEN_CURSOR
select * from v$parameter where name = 'open_cursors'

[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只需要设置一个比较小的值,就足够使用了,除非有非常特别的要求。

阅读(842) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~