一、open_cursors

1. 检查数据库中的 OPEN_CURSORS 参数值:

Oracle 使用 init.ora 中的初始化参数 OPEN_CURSORS 指定一个会话一次最多可以拥有的游标数。缺省值为

50。要获得数据库中 OPEN_CURSORS 参数的值,可以使用以下查询:

SQL> show parameter open_cursors;

NAME TYPE VALUE

———————————— ———– —————

open_cursors integer 300

重要的是将 OPEN_CURSORS

的值设置得足够大,以避免应用程序用尽所有打开的游标。应用程序不同,该值也不同。即便会话打开的游标数未达 OPEN_CURSORS

指定的数量(即设置的值高于实际需要的值), 也不会增加系统开销。

2.修改 OPEN_CURSORS 的参数值。

截个图吧,更快一点,整体步骤如下:

3、结果分析:

按以往经验来说,这种错误主要是由于应用程序端(JAVA)造成的。主要原因是:

对于jdbc来说,每一个从Connection相当于一个Session。在执行conn.createStatement()和conn.prepareStatement()产生一个Statement的时候,实际上都是相当与在数据库中打开了一个cursor。尤其是,如果你的createStatement和prepareStatement是在一个循环里面的话,就会非常容易出现这个问题。因为游标一直在不停的打开,而且没有关闭。

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

如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。

但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正常访问数据库。

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

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

在该问题中,仅根据上面得错误,并不能断定是执行sql导致cursor泄漏,但未做详细测试,只是初步估计是由于频繁的触发级连触发器造成ora-00604.

就相当于:

begin

for i in 1 .. 100

loop

for j in 1 .. 5

loop

open l_cursor for 'select * from dual xx' || i;

close l_cursor;

end loop;

end loop;

end;

二、sessions

在初始化参数所设定的限制中,最为人所知的估计就是sessions和processes

Sessions 参数指定了一个

Instance中能够同时存在的sessions数量,或者说,就是能同时登陆到数据库的并发用户数。通常,我们设定这个数字时需要考虑我们可能会有多少个同时连接到数据库的并发用户,并加上后台进程的进程数,最后乘与1.1.

sessions=(1.1*process+5)

比如说,估计系统中可能会同时有100个用户连接到数据库,那么,你的session最少应该为

(100 + 10 ) * 1.1 = 121

当数据库连接的并发用户已经达到这个值时,又有新session连进来,就会报错

00018, 00000, "maximum number of sessions exceeded"

// *Cause: All session state objects are in use.

// *Action: Increase the value of the SESSIONS initialization

parameter.

三、 Processes

和Sessions是类似的是processes这个参数。

Processes参数指定了Instance在OS层面所能同时运行的进程数。基于和sessions设定同样的考虑,我们在设定processes时,也应考虑我们可能会有多少个同时连接到数据库的并发用户,并加上后台进程的进程数。

当然,在MTS(shared

server)的配置下,这个值的确定会有所不同。应该是普通后台进程+最大共享服务器的进程数(max_shared_servers) +

最大Dispatcher进程数(max_dispatchers).

另外,由于在window平台中,Oracle是以单一一个进程的形式存在,Processes

参数变成了限制Oracle进程里的线程数了。

当Oracle需要启动新的process而又已经达到processes参数时,就会报错:

00020, 00000, "maximum number of processes (%s)

exceeded"

// *Cause: All process state objects are in use.

// *Action: Increase the value of the PROCESSES initialization

parameter.

oracle中的open,oracle最常见的三个参数:open_cursors、sessions、processes相关推荐

  1. oracle中的checkpoint,Oracle checkpoint详解

    checkpoint扫盲 什么是checkpoint 在数据库系统中,写日志和写数据文件是数据库中IO消耗最大的两种操作,在这两种操作中写数据文件属于分散写,写日志文件是顺序写,因此为了保证数据库的性 ...

  2. oracle中常用关键字,oracle常用函数及关键字笔记

    --函数及关键字-- 1.trim,ltrim,rtrim 去除字符,无指定默认去除空格 SELECT TRIM('a' FROM 'aafhfhaaaaaaaa'), LTRIM('aafhfhaa ...

  3. oracle中call用法,Oracle数据库中 call 和 exec的区别

    Oracle数据库中 call 和 exec的区别 今天发现了一个小东西,觉得很有意思,查找了一些资料,跟大家分享一下: 在sqlplus中: 在第三方提供的工具(如:plsqldev) 总结: ex ...

  4. oracle中rowid列,Oracle中的rowid

    ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是O ...

  5. oracle中 怎么替换,oracle如何替换字符串?

    oracle替换字符串的方法:1.replce方法,代码为[REPLACE(sourceStr, searchStr, replacedStr)]:2.translate方法,代码为[TRANSLAT ...

  6. oracle中DBWR全称,Oracle基本术语大全

    Oracle基本术语大全 §2.4.2 重做日志工作模式Oracle可以在两种模式之一来工作: 1)ARCHIVELOG模式(可恢复) Oracle 一般至少有两个日志文件.它们轮流交替地被写入所作的 ...

  7. 在Oracle中exception关键字,Oracle表字段有Oracle关键字出现异常解决方案

    一.问题由来 现在进行项目改造,数据库需要迁移,由原来的使用GBase数据库改为使用Oracle数据库,今天测试人员在测试时后台报了一个异常. 把SQL语句单独复制出来进行查询,还是报错,仔细分析原因 ...

  8. oracle中各种函数,oracle中常用函数大全

    1.数值型常用函数 函数 返回值 样例 显示 ceil(n) 大于或等于数值n的最小整数 select ceil(10.6) from dual; 11 floor(n) 小于等于数值n的最大整数 s ...

  9. oracle中判断空,Oracle中判断空游标的方法

    1.声明包 create or replace package TAL_TEST is -- Author : ADMINISTRATOR -- Created : 2012/12/9 15:15:3 ...

最新文章

  1. 在macOS 10.13.6上安装go 1.13.8实录
  2. pandas使用groupby函数计算dataframe数据中每个分组的N个数值的滚动加和(rolling sum)、例如,计算某公司的多个店铺每N天(5天)的滚动销售额加和
  3. 七牛访谈|秒拍&小咖秀CTO汤力嘉:产品的生存系于技术
  4. C语言:一个数组中只有两个数字是出现一次
  5. ocbase 数据库 蚂蚁_iOS开发数据库篇—FMDB简单介绍
  6. 使用Spring MVC进行资源版本控制
  7. [渝粤教育] 南京信息职业技术学院 电工电子技术基础 参考 资料
  8. 比特币的缺陷以及改进
  9. [源码和文档分享]基于JAVA的即时通信软件
  10. Spring cloud学习总结
  11. 卡塔兰数(Catalan)
  12. 第二十三模板 1什么是模板
  13. 编译原理(第3版)陈火旺——课后习题答案——第四章
  14. XZ_icp金融经营许可证相关的文档和相关问题
  15. 某验四代消消乐 js逆向
  16. jieba库是python提供的一个标准的用于分词的函数库_运用jieba库分词
  17. win7录屏_win7电脑怎么录屏?这个实用工具给你答案
  18. 鼠标右键中新建选项消失
  19. 计算机无法删除u盘里东西,u盘里东西删不掉,详细教您u盘文件删不了怎么办
  20. 文件夹共享失败解决方式

热门文章

  1. java string 去掉某个字符_JAVA String 如何去掉指定字符
  2. mysql最细粒度的权限是什么_粗粒度与细粒度权限控制
  3. 极客时间——数据结构与算法(39) 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想
  4. 待我兵临城下,许你半世繁华
  5. 百度细雨算法2.0正式上线
  6. 收单外包机构备案业务类型汇总分析
  7. 读书笔记:读《知道做到》学“知行合一”
  8. 解决邮件客户端QQ Mail及Thunderbird无法登入Outlook的问题
  9. [原]简易Windows密码查看器
  10. 【超详细】使用Oracle VM VirtualBox 搭建一个Linux虚拟机