程序里报超出最大游标数时,是因为访问结束后数据后的游标却没有及时释放,需要找到是哪一段代码引发了此问题,定义错误代码的步骤如下:
第一步:看各用户的连接数
SQL> select user_name, count(*) from v$open_cursor group by user_name;
SQL> select user_name, count(*) from v$open_cursor group by user_name;
第二步:看指定用户(如:应用库用户名BM_APP)的连接占用大于3个的sql
SQL> select sql_text, count(*) from v$open_cursor where user_name = 'BM_APP' group by sql_text having count(*) > 3 order by count(*) desc;
第二步中占用较大的,也有一些是你看不懂的,有是不是我们的语句是数据库自身的,可以不必管,把我们产生的查询语句找出来
特别是重复刷新某一个页面,观察sql数量的变化,访问一次页面,值就增长若干个的,就是原凶了
接下来就是想办法查出这个sql的完整语句 :
第三步:查询出指定某一个sql的sql_id
SQL> select sql_id, sql_text from v$open_cursor where sql_text = '换成要查的语句';
根据这个sql_id,到查询窗口,查询出相对完整的语句,说相对完整是因为若sql语句过长时,是显示在clob字段中的,需要通过程序才能查出来了,不过通过sql_text也能猜个八、九不离十了
SELECT * FROM v$sql where SQL_id = 'sql_id的值';
根据sql语句找到对应的业务代码去分析就可以了。
===========================================================================================
我之前查到的是在反射方式下,若使用了Hibenate的lazy=false会引发游标不释放,因此最好不要使用lazy=false,将其改成lazy=true
9581

被折叠的 条评论
为什么被折叠?



