透过现象看现象(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 ...
随机推荐
- ss + pac
浅析PAC,教你动手修改你的PAC文件及user-rule文件实现自动代理 - 推酷http://www.tuicool.com/articles/V77jyu shadowsocks自定义代理规则u ...
- poj 3468:A Simple Problem with Integers(线段树,区间修改求和)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 58269 ...
- [LeetCode] Remove Duplicates from Sorted List II
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...
- 修改了/etc/fstab之后出现登录密码输入之后又返回登录界面的问题
最后那一个挂载到/home下面的盘是我新增加的,如果注释掉就一切正常,如果取消注释,就会发生标题说的问题. 后来我意思都这样直接挂载,导致/home下面原本的东西不在了,注释掉之后再来看,发现下面确实 ...
- Implementing Navigation with UINavigationController
Implementing Navigation with UINavigationController Problem You would like to allow your users to mo ...
- android 入门-本地化语言
打包安装到手机上,改变手机系统语言,你在看看是不是改变了.哇.真的可以.
- android用户界面详尽教程实例
android用户界面详尽教程实例 1.android用户界面之AlarmManager教程实例汇总http://www.apkbus.com/android-48405-1-1.html2.andr ...
- 【SQL 触发器】
一.MySQL上触发器的使用 示例: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW t ...
- Android源码学习之模板方法模式应用
一.模板方法模式定义 模板方法模式定义: defines the skeleton of an algorithm in a method, deferring some steps to subcl ...
- LR通过snmp监控linux下的mysql
LR通过snmp监控linux下的mysql 在linux底下安装配置snmp: 1.使用系统盘安装rpm包(这种方式最好) 2.在www.net-snmp.org处下载net-snmp安装(安装后有 ...