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提示看看是否有问题