关于cobol batch处理中的restart

批量文件处理中,如果因为某条数据错误导致了job abend,重新启动job再处理,几十分钟甚至几个小时的作业丢失对于分秒必争的batch cycle就是个噩梦!

尤其是对DB2和file同时处理的关键程序,job abend,DB2 roll back,但是VSAM file却是已写的已经写进去,已更新的已经更新,无法保持同步,再re-run,数据一片狼藉。

有一个很好的practice能够解决上述问题。注意,一下三部分是协同运作,从而保证DB2, VSAM, Sequential file保持同步。

1,DB2:

1)- 加入commit,比如每处理1000条数据,commit一次,这时要注意定义DB2 cursor的时候要用with hold,防止commit使把游标关掉。

2)- 在cobol中引入专门用来记录处理到多少条的DB2 table,暂且命名为record table。key值可以记录作业名,步骤名,程序名,条数。每次读入程序,先去检索record table是否有restart信息:

如果有,那么证明这个程序是异常终止掉重新启动的,那么就读文件,一直读到record table里记录的那一条,从下一条开始处理。这样,就跳过了已经处理过的数据,不做造成重复作业。

如果没有,我们需要在record table里插入数据,创造出这样的记录。

那么在程序正常处理后,每次commit之前,在record table里记下处理过的条数。

假设在任何时候出现了问题,DB2会roll back到之前commit的点,而不是全部回滚。

如果程序正常处理终了,那么只需delete掉record table里的数据,本次记录结束。

经常commit,还有一点好处,是避免大批量DB2数据pending的状态。大量数据等待,也会导致系统资源崩溃。

2, VSAM 文件:

在程序中可能会对VSAM文件进行write(insert),rewrite(update),delete的操作,而且这些操作是不可逆的,不会因为abend而进行任何回滚。

解决办法是记录每次VSAM的操作,记录下VSAM名字,操作,操作之前的数据,以及commit的记录。

如果有abend,需要把VSAM file的变化以commit为节点,全部撤回,insert的给delete掉,update的给update回去,delete掉的给insert回来。

着需要另外一个程序来完成。

3,Sequential 文件:

Sequential包括GDG文件和一些flat文件,这类文件的特点是只能逐条记录,并且不可逆,而且在作业中,这类文件的disposition属性为(New,Catalog,Delete)。重启作业新建文件,之前的记录就会丢失。

如果改成Mod或是share,那么重新启动作业,只会让文件里的记录重复(比如1000条的时候commit,1500条的时候abend,那么重启会从1001条开始,那么这时1001到1500之间写出的文件记录就会是重复的)。

一个解决办法是定义另一个Sequential 文件,暂且命名为memory file,记录每个Sequential 文件的记录,以及commit的点。

当主程序查询record table发现此时是个重启程序后,则执行去读memory file,把所有记录下来的记录全重新写一次,直到上次commit的节点。

整个过程仿佛比较庞杂,然而这是我们在处理批次程序中不得不考虑的事情,在JCL以及COBOL程序里的设置上,有很多细节需要注意。如果有问题或需要,请留言,我们进一步讨论。

希望能有朋友也来分享batch restart的方法,我们一起探讨进步。

时间: 2024-11-12 12:59:04

关于cobol batch处理中的restart的相关文章

批处理中set截取字符详解

set截取字符详解  在批处理中,set的功能有点繁杂:设置变量.显示环境变量的名及值.做算术运算.等待用户的输入.字符串截取.替换字符串,是我们常用的命令之一. 在字符串截取方面,新手因为没能注意到偏移量的问题,很容易提取到错误的字符串,因此,特开此帖,详细解释 set 截取字符的用法. 我们先来看一个例子: set str=123456789 现在,我需要提取变量 str 中的第一个字符,那么,该怎么写命令呢? set var=%str:~1,1%?我想,这很可能是很多粗懂set用法的新手们

PO状态为“处理中”的处理方法

EBS中经常会出现PO提交审批后状态为"处理中"的情况,此时PO创建人无法打开,审批人也无法打开,工作流等查看也无异常,可以使用一下SQL处理再进行审批: --set serveroutput on size 100000DECLARE CURSOR POTORESET IS SELECT WF_ITEM_TYPE, WF_ITEM_KEY, PO_HEADER_ID, SEGMENT1, REVISION_NUM, TYPE_LOOKUP_CODE FROM PO_HEADERS_A

批处理中Copy与Xcopy命令的区别(转自:www.jbxue.com)

有关批处理脚本中,copy命令与xcopy命令在用法上的一些区别.原文地址:http://www.jbxue.com/article/14536.html Copy与Xcopy的区别一,copy不能在有子目录存在的文件中拷贝文件的同时重命名此文件名说明,这里C:为根目录,bat为子目录),而xcopy能,不过会出现提示,当然可以加参数而不使它提示. C:\>copy c:\bat\hai.bat d:\bat\hello.bat提示:系统找不到指定的路径. 已复制 0 个文件.可以这样: C:\

批处理中set截取字符具体解释

set截取字符具体解释  在批处理中,set的功能有点繁杂:设置变量.显示环境变量的名及值.做算术运算.等待用户的输入.字符串截取.替换字符串,是我们经常使用的命令之中的一个. 在字符串截取方面,新手由于没能注意到偏移量的问题,非常easy提取到错误的字符串,因此,特开此帖,详解 set 截取字符的使用方法. 我们先来看一个样例: set str=123456789 如今,我须要提取变量 str 中的第一个字符,那么,该怎么写命令呢? set var=%str:~1,1%?我想,这非常可能是非常

异常处理中throws和throw的区别?

异常处理中throws和throw的区别: 1.作用不同:throw用于程序员自行产出并抛出异常:throws用于声明在该方法内抛出了异常 2.使用的位置不同:throw位于方法体内部,可以作为单独语句使用:throws必须跟在方法参数列表的后面,不能单独使用. 3.内容不同:throw抛出一个异常对象,且只能是一个:throws后面跟异常类,而且可以有多个 原文地址:https://www.cnblogs.com/suger-4/p/12192418.html

[转]批处理中

本文来自:http://www.jb51.net/article/105325.htm regsvr32 "%~dp0phCache.dll" 在一个批处理中看到以上语句,并且同目录下有 Cache.dll 这个文件,所以百度了一下,得到上面网址中的信息. 摘要: 我们来重申下 %~dp0 和 %cd% 的区别, %cd% 和 %~dp0 都能用来表示当前目录,但是他们在不同的使用场景下,功能却不相同: %cd% 代表的是当前工作目录(current working directory

图像处理中mask

转自 http://blog.csdn.net/meng4411yu/article/details/10033325 1.掩膜的定义 掩模是由0和1组成的一个二进制图像.当在某一功能中应用掩模时,1值区域被处理,被屏蔽的0值区域不被包括在计算中.通过指定的数据值.数据范围.有限或无限值.感兴趣区和注释文件来定义图像掩模,也可以应用上述选项的任意组合作为输入来建立掩模.(来自百度百科http://baike.baidu.com/view/2062299.htm#2) 2.图像掩膜例子 图1 掩膜

windows 异常处理中VEH、SEH、UEH、VCH 之间的关系

1.当异常交由用户处理时,按照以下顺序调用异常处理方式VEH-〉SEH-〉VCH .2.当VEH表示处理了异常,就不会传递给SEH,但是会传递异常给VCH .3.当VEH没有处理了,就会传递给SEH.4.当SEH的所有异常处理函数没能够处理异常,会调用默认的SEH(就是UEH,只是方式属于SEH)处理函数.5.当SEH处理了异常,从 except 开始执行,就不会再将异常传递给VCH .6.当SEH返回异常产生处执行,在返回之前会调用VCH .注意!!!在 *unix 中是用信号来处理的.所以如

协议栈处理中的conntrack HASH查找/Bloom过滤/CACHE查找/大包与小包/分层处理风格

1.路由CACHE的优势与劣势 分级存储体系已经存在好多年了,其精髓在于"将最快的存储器最小化,将最慢的存储器最大化",这样的结果就使资源利用率的最大化,既提高了访问效率,又节省了资源.这是所有的CACHE设计的基本原则. 对于内存访问,几乎所有的CPU都内置了一级cache,二级cache,亲和力好的几个核心甚至设计了三级cache乃至四级cache,然后才是物理 内存,然后是经过精密优化的磁盘交换分区,最后是远程的存储器,这些存储空间逐级变大,访问开销也逐级变大,构成了一个金字塔型