【案例49】ORA-01000:超出打开游标的最大数

news2024/9/21 15:51:25

问题现象

在登录系统时提示报错:ORA-01000 超出打开游标的最大数。

问题分析

游标就是看成是指向结果集的指针。可以把它看成一种资源,或者一种数据结构。 

ORA-01000是开发中常见的异常。这个异常表示程序中打开的游标数目> 数据库中设定的可以打开的最大游标数。
 
这个异常通常由2个原因导致
 
1)、 数据库中设置的maximum open cursors太小
 
2)、在 java jdbc程序中通常是代码中打开的resultset 或 preparedstatment 没有被关闭。 

首先排查数据库设置的游标参数open_cursors,此值为3000,说明已经之前扩展过相关参数,默认为300。已经比较大了。

show parameter open_cursors

查询油标谁占用的最多发现为exxk_xxx_dzd相关表。(表名已经隐藏)

select count(*),sql_text from v$open_cursor group by sql_text order by 1 desc;  

查询游标的详细信息,发现占用游标的机器为测试环境。 

select o.sid,
       osuser,
       machine,
       o.sql_id,
       o.sql_text,
       o.cursor_type,
       count(*) num_curs
  from v$open_cursor o, v$session s
 where user_name = 'xxx' ---数据库用户
   and o.sid = s.sid
 group by o.sid, osuser, machine, o.sql_id, o.sql_text, o.cursor_type
 order by num_curs desc;

解决方案

扩展游标数为5000,重启NC,无需重启数据库。

alter system set open_cursors=5000 SCOPE=BOTH; 

由于游标数已经设置3000多,算是比较大,所以需要与相关业务研发沟通,相关代码中打开的resultset 或 preparedstatment 是不是没有被关闭,需要出具相关补丁进行修复。

代码修复逻辑

通常这个异常是由Java程序未关闭ResultSet 或者 PreparedStatment 造成的。正确的适用方法, 总是把close()放在finally中,这样不管有没有发生其他异常,都会关闭ResultSet 和 PreparedStatement。在代码层面更换执行方法为executeBatch(),但是在进行大批量数据库操作时,要进行分批执行

Statement stmt = conn.createStatement();
 
try {
    ResultSet rs = stmt.executeQuery( "SELECT FULL_NAME FROM EMP" );
    try {
        while ( rs.next() ) {
            System.out.println( "Name: " + rs.getString("FULL_NAME") );
        }
    } finally {
        try { rs.close(); } catch (Exception ignore) { }
    }
} finally {
    try { stmt.close(); } catch (Exception ignore) { }
}

 相关示例

//示例,获取直接用不了

public class XXX  implements XXXX {

	@Override
	public void AAA (String tablename, String[] lockkeys, String pk_user) throws TMDBLockException {
		try
		{
			//1:查询各个lockkeys是否已经在数据库中,存入Map 
			B pm = B.getInstance(C.getInstance().getUserDataSource());
			IUAPQueryBS query = NCLocator.getInstance().lookup(IUAPQueryBS.class);
//			BaseDAO dao = new BaseDAO();
			String strSql = ""; 
			List<Object[]> rsList = new ArrayList<Object[]>();
			ArrayListProcessor processor = new ArrayListProcessor(); 
			strSql = "select a.lockkey,b.user_name from " + tablename + " a left join sm_user b on a.userid = b.cuserid  where a.lockkey in ('' ";
			for(int i=0;i<lockkeys.length;i++){
				strSql = strSql + "," + "'" + lockkeys[i] + "'";
			}
			strSql = strSql + ") "; 
			Map<String,String> lockmap = new HashMap<String,String>();
			String key = "";
			String value = "";
//			rsList= (List<Object[]>)pm.D().executeQuery(strSql, processor);
			rsList= (List<Object[]>)query.executeQuery(strSql, processor);
			if (rsList.size()!=0 ){
				int lenrow = rsList.size(); 
				for (int i=0;i<lenrow;i++){
					Object[] objs = (Object[])rsList.get(i);
					if (null !=objs[0]){
						key = objs[0].toString();
						if (null !=objs[1]){
							value = objs[1].toString();
						}else{
							value = "";
						} 
						lockmap.put(key, value);
					}					
				}
			}
			//2:如果lockkeys已经存在,Update;如果lockkeys不存在,Insert
			for (int i = 0; i < lockkeys.length; i++) {
				key = lockkeys[i];
				StringBuffer sql = new StringBuffer();
				if(null ==lockmap.get(key)){  
					sql.append("insert into ").append(tablename).append("(").append("lockkey,userid").append(") values ('").append(lockkeys[i]).append("','").append(pk_user).append("')");
					pm.D().addBatch(sql.toString());
				}
			}
			pm.D().executeBatch();
		} catch (DbException e) {
			nc.bs.logging.Logger.error(e.getMessage(), getClass(), "DBLockManageServiceImpl.AAA");	
			throw new nc.vo.tmpub.exception.E(e.getMessage(), e);
		} catch (BusinessException e) {
			nc.bs.logging.Logger.error(e.getMessage(), getClass(), "出现异常");	
			throw new nc.vo.tmpub.exception.E(e.getMessage(), e);
		}


	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2057906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV几何图像变换(2)计算仿射变换矩阵的函数getAffineTransform()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算三对对应点之间的仿射变换。 该函数计算 23 的仿射变换矩阵&#xff0c;使得&#xff1a; [ x i ′ y i ′ ] map_matrix ⋅ [ x i y i 1 …

Datawhale AI 平台 证书 存个档

&#xff01;证书不怕多 &#x1f508; 大模型开发 工程师 欢迎参与 Datawhale 大模型开发 工程师 计划 联合浪潮信息 面向在校学生、社会在职人士 可获官方颁发的 大模型开发工程师 证书 认证地址&#xff1a;大模型开发工程师考试入口&#xff08;电脑端打开&#xff09;评…

C++笔记---类和对象(下)

1. 初始化列表 1.1 初始化列表的使用 在构造函数中&#xff0c;对成员变量进行初始化可以说是公式化的步骤&#xff0c;而初始化列表就将这一步骤进行了标准化。 初始化列表紧跟在构造函数的参数列表后面&#xff0c;使用方式是以一个冒号开始&#xff0c;接着是一个以逗号分…

今日总结:解决了三个小问题

问题01 1.在Bootstrap5中&#xff0c;offcanvas失去焦点后会自动回到顶端&#xff0c;用了一个非常简单的方法&#xff0c;将触发侧边栏的按钮代码由 <button type"button">换成 <a type"button">更多解决方法详见&#xff1a;更多方法 注…

杰发科技AC7801——GPIO通过寄存器地址控制高低电平

通过这个寄存器来查看控制的是哪个ODR值&#xff0c;使用sample&#xff0c;发现是0x20080068的第7和第9位 使用51控制寄存器的代码来置高置低代码&#xff0c;注意变量需要用unsigned int来声明 unsigned int ledBit 0;mdelay(100);ledBit | (1 << 9); ledBit & ~…

【第五节】Win32汇编程序设计

目录 一、汇编的第一个“helloworld” 二、汇编中的标号 三、的使用 四、数据定义 五、全局变量 六、局部变量 七、结构体 八、结构体的访问 九、获取变量地址 十、函数 十一、分支与循环 十二、内联汇编 十三、裸函数的使用 一、汇编的第一个“helloworld” .38…

从桌面到云端,2024年智能录屏解决方案全攻略

从教学演示到游戏直播&#xff0c;从软件教程到会议记录&#xff0c;录屏软件已经逐渐成为不可或缺的工具。那么面对这众多录屏软件我们要怎么选择呢&#xff1f;有没有和win10录屏快捷键一样可以快捷操控的工具呢&#xff1f;这次我们一起来探讨吧。 1.福昕录屏大师 链接&am…

Windows下线程的创建与使用(win32-API)

一、前言 线程是比进程更轻量级的执行单元&#xff0c;允许在一个进程中并发执行多个控制流。每一个线程都有自己的程序计数器、寄存器集和栈空间&#xff0c;但它们共享所属进程的全局数据和资源。这种共享内存模型使线程间的通信比进程间通信更为高效&#xff0c;同时也带来…

2-71 基于matlab的小波分析在心电信号去噪中的应用

基于matlab的小波分析在心电信号去噪中的应用&#xff0c;主要针对心电信号中的肌电干扰/基线漂移/工频干扰进行的算法研究&#xff0c;输出了三类去噪结果。程序已调通&#xff0c;可直接运行。 2-71 基线漂移去噪 工频干扰去噪 - 小红书 (xiaohongshu.com)

android apk 加固后的地图加载异常及重新签名

1.首先根据需求将打包生成后的APK进行加固&#xff0c;可以使用360、阿里、腾讯加固等。 2.加固后的APK无法直接安装&#xff0c;需要重新进行签名。 3.首先找到sdk的位置&#xff0c;进入build-tools目录。 4.根据gradle文件选择版本目录。 5.将加固后的APK放至该目录下。在…

QT-小游戏翻金币

QT-小游戏翻金币 一、演示效果二、使用步骤三、下载链接 一、演示效果 二、使用步骤 #include "chooselevelscene.h" #include <QMenuBar> #include <QPainter> #include "mypushbutton.h" #include <QDebug> #include <QTimer> …

Ajax-3

一.图片上传 1.获取图片文件对象 2.使用FormData携带图片文件 const fd new FormData() fd.append(参数名, 值) 3.提交表单数据到服务器&#xff0c;使用图片url网址 二.AJAX原理—XMLHttpRequest 定义&#xff1a;XMLHttpReques&#xff08;XHR&#xff09;对象用于与服务器…

P38-数据存储1

百度2015年系统工程师笔试题 编程题 编程题 编程题 编程题

20240820飞凌的OK3588-C的核心板在Linux R4下使用poweroff关机

20240820飞凌的OK3588-C的核心板在Linux R4下使用poweroff关机 2024/8/20 14:03 经过测试&#xff0c;poweroff有效&#xff0c;关机之后&#xff0c;12V/0.024A12*0.0240.288W shutdown无效。 reboot -p无效。 rootok3588:/# rootok3588:/# shutdown -h now sh: shutdown: c…

Maven-06.依赖管理-依赖传递

一.依赖传递 什么是依赖传递&#xff1a;projectA依赖于JAR包和projectB&#xff0c;而JAR包又依赖于黄色的JAR包。而projectB依赖于projectC和其他JAR包。因此projectA依赖于projectB,projectC和图中的所有JAR包。这就是依赖的传递性。其中蓝绿色部分成为直接依赖。在当前项目…

ant design pro 的环境变量的使用

如上图所示&#xff0c;定义好环境变量后&#xff0c;整个应用的名字就发生的变化。 规则 环境变量的名称要以 UMI_APP 开头 如何使用这个环境变量 直接用 process.env.UMI_APP_APP_NAME 来调它。 ant design pro 如何去保存颜色ant design pro v6 如何做好角色管理ant desi…

【2025校招】4399 NLP算法工程师笔试题

目录 1. 第一题2. 第二题3. 第三题 ⏰ 时间&#xff1a;2024/08/19 &#x1f504; 输入输出&#xff1a;ACM格式 ⏳ 时长&#xff1a;2h 本试卷分为单选&#xff0c;自我评价题&#xff0c;编程题 单选和自我评价这里不再介绍&#xff0c;4399的编程题一如既往地抽象&#xff…

JavaScript(25)——BOM、延迟函数、JS执行机制

BOM BOM是浏览器对象模型 window对象是一个全局对象&#xff0c;也就是JavaScript中的顶级对象所有通过var定义的全局作用域中的变量&#xff0c;函数都会变成window对象的属性和方法window对象下的属性和方法调用的时候可以省略window 延时函数 let a setTimeout(回调函数…

Python(Falsk) + React Golang(Gin) + Vue 全栈开发的最佳实践

前面分别讲了 Python(Falsk) 、 React 、 Golang(Gin) 、 Vue(Element)&#xff0c;现在整体的给大家汇报一下&#xff0c;这个是简单搭建的demo&#xff0c;后面的添砖加瓦需要自己动手咯&#xff0c;有不明白的可以参考一下小编前面的文章&#xff0c;也许会给大家有答疑解惑…

QTday04

1.思维导图 2. . #include "widget.h" #include "ui_widget.h" #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(this)) //给语音播报者实例化空间{ui->setupUi(th…