日期:2014-05-17  浏览次数:21766 次

求助 生产库中ORA-04025: maximum allowed library object lock allocated for select
Cause: java.sql.SQLException: ORA-04025: maximum allowed library object lock allocated for select /*+ cursor_sharing_exact */  
生产库中每48个小时会重现一次本错误;
不知各位有没有碰到过这个问题, 我上网查过没有很好地解决方法,只是提到可能是游标未正常关闭等, 我正在尝试本地重现错误, 请遇到过这个问题的朋友帮忙看一下。 十分感谢。。

相关环境配置: 
1.后台查询数据库Spring+Ibatis , 报错的sqlMap.xml中的语句是这样的 , 业务逻辑均用 table和col代替
SQL code
select /*+ cursor_sharing_exact */
                
            A.col1 as xxx,
            A.col2 as xxxx,
            b.col1 as xxxx,
            b.col2 as xxxxx
        from 
            table1 a , 
            table2 b   
        where 
            a.col1 = b.col1 and 
            NLSSORT(LOGIN_ID, 'NLS_SORT=BINARY_CI')
                = NLSSORT(#bindingVariable:VARCHAR#, 'NLS_SORT=BINARY_CI') and
            b.col2= 'Active'


2.Product 数据库配置
PARAMETER VALUE USAGE
---------------------- -------------------- -----
session_cached_cursors 50 276%
open_cursors 300 47%

Cursor_sharing 设置为 force

再次感激!


------解决方案--------------------
在这种情况下出问题的话,建议可以尝试降低session_cached_cursors
提高open_cursors

因为cursor_sharing_exact 时,session_cached_cursors是不起作用的
open_cursors是游标总数,当然,这一切建立在你的内存足够的基础上。

生产上用,不好说。我也仅仅是就事论事
------解决方案--------------------
看看数据库日志中的错误,定位下错误原因,第一次见这个错误
------解决方案--------------------
我从表面上看,是因为用了cursor_sharing_exact这个hint,oracle不强制绑定变量,导致游标过多,从而导致管理的对象过多造成的。
------解决方案--------------------
/*+ cursor_sharing_exact */ 只有SQL 语句完全相同的情况下,才会使用相同的cursor,即执行计划

建议你去掉这个HINT提示看看是否有问题