透过现象看现象(SQL501N错误处理)
某日一直运行比较正常的报表系统,突然报存储过程执行失败,查看DB2 错误返回码为sql501n,查看此错误原因如下:
[db2inst1@limt ~]$ db2 ? sql501n
SQL0501N The cursor specified in a FETCH statement or CLOSE statement
is not open or a cursor variable in a cursor scalar function
reference is not open.
Explanation:
The program attempted to do one of:
* FETCH using a cursor at a time when the specified cursor was not
open.
* CLOSE a cursor at a time when the specified cursor was not open.
* Reference a cursor variable in an OPEN statement and the cursor
variable is not open.
* Reference a cursor scalar function, such as CURSOR_ROWCOUNT function,
and the cursor variable is not open.
通过上述描述可以看出程序在FETCH 或者CLOSE 游标的时候,游标没有打开。
随后导出存储过程源码查看,此存储过程特点如下:
1 存储过程结构比较清晰,代码比较简单,在存储过程中调用了另一个存储过程
2 在存储过程中打开了一个游标,并且在代码后面也CLOSE了游标,在FETCH阶段也没有提前CLOSE游标
3 在嵌套的存储过程中也打开了游标,并且合理的关闭了游标
4 在嵌套的存储过程中也没有COMMIT操作(任何一个commit操作会导致所有的游标被关闭)
从代码上看不出来问题,那么回到系统整体上来分析:
1 此存储过程每天执行一次,以前从来没失败过
2 目前也不是每天都失败,偶尔也有成功的时候
3 每次失败的时候,在重新执行一次必然成功
4 此数据库前几天刚从V9.5.0.5升级到V9.5.0.10(V9.5.0.5 在linux系统上有内存泄露,导致SWAP空间被耗尽)
从上面两方面分析可以基本确定两点:
1 应该不是代码问题,如果是游标使用不当,那么为什么第二次调用就会成功
2 应该是数据库版本升级导致的存储过程执行错误,在数据库升级之前从来没失败过
那么怎么解决这个问题,不可能回退到V9.5.0.5版本,初步分析可能是V9.5.0.10对游标使用发生了某些变化,
随后做了一下两个尝试:
1 重新rebind存储过程 db2 rebind xxxx,在做完此操作后,刚好遇到十一长假,竟然连续十几天没有报错,以为问题解决了,可是没过几天就
又开始报错了,看来问题没有解决;
2 然后就在网上百度,资料甚少,看来用DB2人还是太少了,点了几个链接后,看到一个类似讨论sql501n错误的帖子,大致提到在V9.7后,
DB2的游标规则做了改变,在游标OPEN阶段如果发生错误,是不会返回错误,在FETCH和CLOSE阶段会暴露错误,看到这里顿时感觉有
点思路,虽然目前V9.5.0.10而非V9.7,但是根据某些传闻,IBM的低版本软件的高FIX补丁相当于高版本,在回去分析这个存储过程,发现此
存储过程运行有以下:
1 如果失败的话,一般都是运行3分钟多失败,如果成功的话就不到三分钟,
2 如果失败的话,一般都是和另外一个存储过并行运行,如果成功的话都是在串行运行
3 此数据库的锁超时设置为3分钟
至此可以基本判定是锁超时导致的存储过程失败,于是在系统上部署了db2cos捕获锁超时,果然第二天捕获到了锁超时,并且与
存储过程的失败时间一致,之后的连续几天都捕获到了关于此存储过程的锁超时,在分析造成锁超时的表与上述的两个存储过程所涉
及的表一致,最后通过调整两个存储过程的执行关系,调整为串行执行后,在没有出现sql501n错误
透过现象看现象(SQL501N错误处理)的更多相关文章
- 通过本质看现象:关于Integer受内部初始化赋值范围限制而出现的有趣现象
左手代码,右手文章.——朱季谦 这是我的第一篇技术博客,作为一名技术小菜鸟,总体而言显得很拙见,但也算是成长路上的一个小脚印,希望能在以后的日子里,可以对JAVA技术有一个更加深入的思考与认识. 前几 ...
- 透过IL看C#:switch语句(转)
透过IL看C# switch语句(上) 摘要: switch语句是 C#中常用的跳转语句,可以根据一个参数的不同取值执行不同的代码.本文介绍了当向 switch语句中传入不同类型的参数时,编译器为其生 ...
- iOS: 学习笔记, 透过Boolean看Swift(译自: https://developer.apple.com/swift/blog/ Aug 5, 2014 Boolean)
透过Boolean看Swift 一个简单的Bool类型内部就包含了许多Swift主要功能, 如何构建一个简单类型是有趣的演示. 本文将创建一个与Bool类型在设计与实现上非常相似的新MyBool类型. ...
- 一道JS面试题所引发的"血案",透过现象寻本质,再从本质看现象
觉得本人写的不算很烂的话,可以登录关注一下我的GitHub博客,新手写东西写的不好之处,还望见谅,毕竟水平有限,写东西只为交流提高,一起学习,还望大神多加指点,指出纰漏,和提出宝贵的意见,博客会坚持写 ...
- 透过现象看webpack处理css文件中图片路径转换的具体过程
webpack是目前使用比较流行的一个前端模块打包器,前端的任何资源都被当成一个模块来处理,如图片.css文件等等.在基于webpack构建的前端项目中,一般都会配置有关css文件处理的规则,这其中也 ...
- 透过现象看本质:Java类动态加载和热替换
摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...
- GetX代码生成IDEA插件,超详细功能讲解(透过现象看本质)
前言 本文章不是写getx框架的使用,而且其代码生成IDEA插件的功能讲解 我之前写过俩篇很长很长的getx文章 一篇入门使用:Flutter GetX使用---简洁的魅力! 一篇原理深度剖析:Flu ...
- [转] 学习,思维三部曲:WHAT、HOW、WHY(通过现象看本质)
https://www.douban.com/note/284947308/?type=like 学习技术的三部曲:WHAT HOW WHY 我把学习归类为三个步骤:What.How.Why.经过我对 ...
- AutoPostBack通过现象看本质
在做人事档案管理系统时遇到一个功能需要实现前台数据(实时)与后台进行交互,解决这个问题首先想到的是应用控件的AutoPostBack属性.本以为这个问题就这样解决了(不用javascript.jque ...
随机推荐
- n的阶乘高精度算法【阶乘】
C语言实验——求阶乘(循环结构) Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu ...
- ORA-03113:通信通道的文件结尾解决
今天跟往常一样,登陆PL/SQL,确登陆失败,出现一个错误“ORA-01034”和“ORA-27101”如图: 然后就就通过命令提示符去登陆Oracle,去查看怎么回事,然后问题进一步出现,错误“OR ...
- nodejs2
jade@1.11.0 严格注意缩进 extends layout block content h1= title p Welcome to #{title} - var a='abc'; p his ...
- iOS开发资料链接
ios开发中文文档了 http://developer.apple.com/library/ios/#referencelibrary/GettingStarted/RoadMapiOSCh/chap ...
- Ubuntu 安装OpenCV3.0.0
Ubuntu安装OpenCV3.0.0 为了看看opencv3.0的HDR效果,尝试安装opencv3.0到ubuntu12.04上面,安装了好几次终于成功了. 参考博客: http://www.sa ...
- 在Salesforce中创建Schedule的Job去定时触发对应的Class
在Salesforce中也存在着Job的概念,当然了我们可以创建Schedule的Job去定时触发对应的Class,来完成我们所需要定时处理的功能,比如:定时同步数据. 具体处理步骤如下所示: 1): ...
- nginx配置文件nginx.conf
#定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_processes 8; #全局错误日志定义类型,[ debug | in ...
- 【spring】 <tx:annotation-driven /> 的理解 【转载的】
在使用SpringMvc的时候,配置文件中我们经常看到 annotation-driven 这样的注解,其含义就是支持注解,一般根据前缀 tx.mvc 等也能很直白的理解出来分别的作用.<tx: ...
- 矩阵快速幂 UVA 10870 Recurrences
题目传送门 题意:f(n) = a1f(n − 1) + a2f(n − 2) + a3f(n − 3) + . . . + adf(n − d), for n > d,求f (n) % m.训 ...
- 设置某个ip对mysql服务器有权限,以及mysql定时备份
CREATE USER 'new_username'@'211.68.%.%' IDENTIFIED BY 'password_for_new_username'; GRANT ALL ON * TO ...