ORA-04031: unable to allocate 4096 bytes of shared memory
下面分析了几个可能及解决方法
基本上,ORA-04031出现的问题有几个可能性
A. 没有绑定编量造成shared_pool碎片过多,同时shared_pool_size太小.
--这个应该是比较常见的,也是Oracle提的最多的。
--这个通常会建议使用绑定变量,或者简单的加大shared_pool.或者临时解决方法就是alter system flush shared_pool.
http://www.dbanotes.net/Oracle/Ora-04031.htm
B. Large_pool,Java_pool太小造成的
--这个通过错误信息的提示很容易判断(Ora-04031 cannot allocate .. memeory in [large_pool])
--解决方法就是简单的加大 Large_pool or Java_pool
C. 过度的开CURSOR而不关闭。
--这个问题发生的越来越多,特别是在JAVA运行环境中,频频出现。加大Shared_pool或者flush shared_pool往往只能延迟问题出现的时间,而没法避免。
--判断方法:
select count(*) from v$open_cursor ;
select * from v$sysstat
where name = 'opened cursors current';
如果出来的值特大(以万为单位)时,基本就可以确定是这个原因了
--解决这个问题的方法就是检查程序,看是否没有正常的关闭cursor(对于JAVA来说,就是没有关闭Statement)。或者select sql_text from v$open_cursor,看看都是哪些cursor没关闭,再去检查车程序。
--也有的程序使用了保持一定量的cursor一直open,从而避免cursor过多次的开启,来提高性能。对于这种情况,则应该选择适当的shared_pool_size和控制keep_opening的cursor的量。
--也有可能Oracle参数session_cached_cursors太大,解决方法就是把它降低到适当的值
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14710393/viewspace-753916/ ,如需转载,请注明出处,否则将追究法律责任。