【问题标题】:SQLSTATE '08003' in SQLRPGLE Program IBMSQLRPGLE 程序 IBM 中的 SQLSTATE '08003'
【发布时间】:2019-12-13 12:48:50
【问题描述】:

我在 SQLRPGLE 程序中发现了一个问题。 它用作 API 程序,用于在订单出现问题时向用户发送邮件。

为了勾画程序的工作原理,我们有一个自动启动作业,它启动一个程序(程序 A),查看创建的每个订单以查看其中的所有数据是否正常。如果不是,它会调用邮件 API 程序。

在程序 A 中有几个发送邮件的 API 调用。 在 API 邮件程序中,我们在名为 FCMAILS 的表中执行 SQL 插入(作为日志记录)。

在程序 A 中,只有 1 个调用总是出错。这是在 SQLSTATE 08003 中进行一些测试后的结果。 意思是“应用程序进程未处于连接状态”。该程序不会崩溃,也不会发出任何 sysopr 通知。它也不会在文件 FCMAILS 中写入记录。

有人知道如何解决这个问题吗?我一直在查看 AS400 的 SQLCONNECT 命令,但没有找到很多关于它的信息,我不想让它变得比现在更糟。

/free
     // save body to text file for loading into clob
     BodyObj_Data = Body;
     BodyObj_Len = %len(Body);
     callp GenGuid(GUID);

     exec sql
       insert into fcmails(
          Guid,SendUser,Program,Sender,Recipient,RecipientCc,RecipientBcc,
          Subject,Body) values
          (:GUID,:SendUser,:Program,:Sender,:Recipient,:RecipientCc,
            :RecipientBcc,:Subject,:BodyObj);

     if sqlstate <> '00000';
       callp XSndMsg(' ':'SYSOP':'Mail Error: P:' + Program +' S:'+sqlstate+
                                 ' subj:' +Subject);

     endif;
     // trigger mail program
     callp SndDtaQ('APIMAILDTQ':'FCDTA500':%Size(GUID):
                    GUID);

     return *on;
  /end-free
 PapiCreateMail    E

【问题讨论】:

    标签: db2 ibm-midrange rpgle


    【解决方案1】:

    我已经在一些非常具体的情况下看到了这种情况,但我不确定为什么会发生这种情况,因为除了本地数据库之外我从来没有连接到任何东西。

    我所做的是创建一个使用EXEC SQL CONNECT RESET; 重新连接的过程。每当找到 08003 SQLSTATE 时,我都会调用该过程。然后我可以重试失败的语句。它需要一些额外的循环,并检查以防止无限循环,但在那之后我再也没有遇到过问题。

    【讨论】:

    • 我现在在 sqlstate = 08003 时实现了 Connect 重置,所以希望这可行。我也觉得奇怪的是连接会丢失,FCMAILS 是本地 DB2 数据库上的一个表。希望这是一个改进。
    【解决方案2】:

    经过很长时间的等待(这是一个检查来自客户的订单的自动过程),它又发生了。

    这是我现在拥有的代码,我通过查看 sqlstate 08003 检查连接是否已关闭 1 次。然后重新连接并执行相同的 sql

    exec sql
           insert into fcmails(
              Guid,SendUser,Program,Sender,Recipient,RecipientCc,RecipientBcc,
              Subject,Body) values
              (:GUID,:SendUser,:Program,:Sender,:Recipient,:RecipientCc,
                :RecipientBcc,:Subject,:BodyObj);
    
         if sqlstate = '08003';
           EXEC SQL CONNECT RESET;
           //retry same command
           exec sql
              insert into fcmails(
              Guid,SendUser,Program,Sender,Recipient,RecipientCc,RecipientBcc,
              Subject,Body) values
              (:GUID,:SendUser,:Program,:Sender,:Recipient,:RecipientCc,
                :RecipientBcc,:Subject,:BodyObj);
         ENDIF;
    
         if sqlstate <> '00000';
           callp XSndMsg(' ':'SYSOP':'Mail Error: P:'+Program+
                             ' S:'+sqlstate+' subj:'+Subject);
         endif;
    
         // trigger mail program
         callp SndDtaQ('APIMAILDTQ':'FCDTA500':%Size(GUID):
                        GUID);  
    

    还有什么想法我可以循环检查 10 次,如果这样会更好吗?

    【讨论】:

      猜你喜欢
      • 2014-06-26
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多