某日一直运行比较正常的报表系统,突然报存储过程执行失败,查看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错误处理)的更多相关文章

  1. 通过本质看现象:关于Integer受内部初始化赋值范围限制而出现的有趣现象

    左手代码,右手文章.——朱季谦 这是我的第一篇技术博客,作为一名技术小菜鸟,总体而言显得很拙见,但也算是成长路上的一个小脚印,希望能在以后的日子里,可以对JAVA技术有一个更加深入的思考与认识. 前几 ...

  2. 透过IL看C#:switch语句(转)

    透过IL看C# switch语句(上) 摘要: switch语句是 C#中常用的跳转语句,可以根据一个参数的不同取值执行不同的代码.本文介绍了当向 switch语句中传入不同类型的参数时,编译器为其生 ...

  3. iOS: 学习笔记, 透过Boolean看Swift(译自: https://developer.apple.com/swift/blog/ Aug 5, 2014 Boolean)

    透过Boolean看Swift 一个简单的Bool类型内部就包含了许多Swift主要功能, 如何构建一个简单类型是有趣的演示. 本文将创建一个与Bool类型在设计与实现上非常相似的新MyBool类型. ...

  4. 一道JS面试题所引发的"血案",透过现象寻本质,再从本质看现象

    觉得本人写的不算很烂的话,可以登录关注一下我的GitHub博客,新手写东西写的不好之处,还望见谅,毕竟水平有限,写东西只为交流提高,一起学习,还望大神多加指点,指出纰漏,和提出宝贵的意见,博客会坚持写 ...

  5. 透过现象看webpack处理css文件中图片路径转换的具体过程

    webpack是目前使用比较流行的一个前端模块打包器,前端的任何资源都被当成一个模块来处理,如图片.css文件等等.在基于webpack构建的前端项目中,一般都会配置有关css文件处理的规则,这其中也 ...

  6. 透过现象看本质:Java类动态加载和热替换

    摘要:本文主要介绍类加载器.自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换. 最近,遇到了两个和Java类的加载和卸载相关的问题: 1) 是一道关于Java的判断题:一个类被首次 ...

  7. GetX代码生成IDEA插件,超详细功能讲解(透过现象看本质)

    前言 本文章不是写getx框架的使用,而且其代码生成IDEA插件的功能讲解 我之前写过俩篇很长很长的getx文章 一篇入门使用:Flutter GetX使用---简洁的魅力! 一篇原理深度剖析:Flu ...

  8. [转] 学习,思维三部曲:WHAT、HOW、WHY(通过现象看本质)

    https://www.douban.com/note/284947308/?type=like 学习技术的三部曲:WHAT HOW WHY 我把学习归类为三个步骤:What.How.Why.经过我对 ...

  9. AutoPostBack通过现象看本质

    在做人事档案管理系统时遇到一个功能需要实现前台数据(实时)与后台进行交互,解决这个问题首先想到的是应用控件的AutoPostBack属性.本以为这个问题就这样解决了(不用javascript.jque ...

随机推荐

  1. Android 注解工具 ButterKnife

    Butter Knife 是 Android 视图字段和方法绑定,使用注解处理来生成样板代码. 主要特性: 在字段使用 @FindView消除findViewById调用 使用 @FindViews在 ...

  2. MySQL5.6 on Windows 安装失败: String was not recognized as a valid DateTime

    在Win7,32位上安装MySQL5.6.21时出现日期/时间格式错误, 如下图所示: 错误描述为: String was not recognized as a valid DateTime. 下面 ...

  3. Linux环境下stl库使用(map)

    例子1: testMap.cpp #include <string.h> #include <iostream> #include <map> #include & ...

  4. phpcms标签使用 —— 系统常量

    以下系统常量全局可用 1 2 3 4 5 6 7 8 9 10 11 12 13 CACHE_PATH 缓存文件夹地址 SITE_PROTOCOL 主机协议 SITE_URL 当前访问的主机名 HTT ...

  5. C# 使用Trace记录程序日志

    在程序开发中,我们通常需要记录程序运行的状态,在程序部署后,发生的异常可以记录在日志中,便于发现程序潜在的问题.在.NET平台,有很多优秀的日志类库,例如Log4Net.如果程序很小,我们可以自己通过 ...

  6. 让用VS2012/VS2013编写的程序在XP中顺利运行

    转自:http://blog.csdn.net/asanscape/article/details/38752655/ 微软为了推销自家平台,默认配置下VS2012和VS2013编写的应用程序只能在V ...

  7. WPF初学(一)——布局【良好界面的基础】

    由Winform转到WPF的一部分人,很可能忽略掉布局,习惯性的使用固定定位.然而,没有良好的布局,后面界面控件画的再好看,花哨,都不过是鲜花插在牛粪上,很可能始终都是一坨??(呵呵). 闲话少说,首 ...

  8. iOS 钥匙串 指纹识别 get和Post请求的区别

    01-钥匙串 1. 通过系统提供的钥匙串功能可以在本地保存密码,系统使用AES的方式对密码加密 a. 查看Safari中保存的密码 2. 使用第三方框架SSKeychain把密码保存到钥匙串和获取钥匙 ...

  9. JSTL标签详解以及应用实例

    JSTL Apache提供的标签库,jar包:jstl-1.2.jar,如果用MyEclipse,它会自动导入,无需自己导入,如果没有使用MyEclipse那么需要自行导入. ------------ ...

  10. 【SQL 数据库】将一张数据表信息复制到另一张数据表

    一.MySQL数据库 1.如果目标表存在 INSERT INTO 目标表  SELECT  * FROM 源表; 2.如果目标表不存在 CREATE TABLE 目标表 SELECT * FROM   ...