您的位置:首页 > 其它

ORA-21500,ORA-24550,ORA-01000 ,ORA-06512同时出现,问题定位及解决办法

2013-12-10 11:03 387 查看
关于ORA-开关的数据库错误,总是很恼人,而且都很不好解决。但最后发现都有解决办法。

今天我的一个进程跑了1个小时后来挂掉了,并且有如下错误信息:

ORA-21500: internal error code, arguments: [kghex: not first], [0x000000000], [], [], [], [], [], []

ORA-24550: signal received: [si_signo=11] [si_errno=0] [si_code=128] [si_int=1152656480] [

ORA-01000: maximum open cursors exceeded

ORA-06512: at "EVOMS.PKG_FE_INPORTDATA", line 1110

ORA-06512: at line 1

没得办法,只好从网上找答案,但是。虽然大家都遇到过其中的一个或者多个错误,他们的解决办法都不适合我。

有些人说是oracle的问题,换台服务器就解决了。有些说数据库配制什么什么的问题,一个个那么高深,我也看不懂。

只好重新审视自己的代码,看是否有问题。因为我之前也遇到过数据库的报错,最后发现是自己的代码有问题。

最后终于找到了一处不合理的地方,我没有用m_p_conn->terminateStatement(p_stmt); 这一句来释放资源,因为我之前

没用,但代码运行都没有问题。想是不是这东西还有什么用,再查资料,发现一段很有价值的信息:

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

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

对于出现ORA-01000错误这种情况,单纯的加大open_cursors并不是好办法,那只是治标不治本。实际上,代码中的隐患并没有解除。

而且,绝大部分情况下,open_cursors只需要设置一个比较小的值,就足够使用了,除非有非常特别的要求。”

虽然我的代码是用c++写的,但这意思是一样的,于是果断加上那句。

最后跑了5,6个小时,现在都还很健在。

嘻嘻,我的问题是这样解决的。

一个教训,写程序不拘小节,必遭劫难!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐