使用JT400连接池调用IBM i RPG程序后,它们引用了错误的库

如何解决使用JT400连接池调用IBM i RPG程序后,它们引用了错误的库

我有一个Java应用程序,该应用程序调用CL程序,然后使用JT400库在IBM i系统上运行多个RPG程序。

首先,我每次都打开一个新的连接,就像这样,并在完成后将其关闭

new AS400(hostname,username,password);

但是,由于连接数量增加,我最近开始使用连接池:

@Bean
public AS400ConnectionPool as400ConnectionPool() {
    String hostname = env.getProperty("AS400Hostname");
    String username = env.getProperty("AS400Username");
    String password = env.getProperty("AS400Password");

    AS400ConnectionPool as400ConnectionPool = new AS400ConnectionPool();
    as400ConnectionPool.setMaxConnections(128);

    try {
        // preconnect 5 connections to the AS400.COMMAND service.
        as400ConnectionPool.fill(hostname,password,AS400.COMMAND,5);
    } catch (ConnectionPoolException e) {
        log.error(e.getMessage());
        e.printstacktrace();
    }
    return as400ConnectionPool;
}

每个连接现在都在使用后返回到池中,而不是被关闭

不幸的是,我们开始看到以前运行完美的相同作业,有时在IBM i上进入MSGW状态。 (消息等待)

在分析作业日志时,我注意到以下类型的错误

CPF4131在打开文件期间出现

大约同时运行来自两个不同库的作业时,似乎正在发生这种情况。 该程序通常同时具有与IBM i的大约10个开放连接,并且可能同时运行许多不同的作业,大多数作业来自同一库,而只有少数几个库位于不同的库中。 稍后再运行相同的呼叫将毫无问题。

我正在运行该程序的库似乎正在该程序未引用的其他库中查找文件

例如以下CL调用

致电pgm(ADDPRGXX / TESTCL)

最终将在随后的RPG调用中导致此类错误

TESTRPG * INIT ADDPRGXX打开SOMEFILE CPF4131 对具有成员SOMEFILE的库ADDFILXS中的文件SOMEFILE进行级别检查。

&N原因。 。 。 。 。 :库ADDPRGXX中的RPG程序TEsstRG 对文件执行隐式OPEN时收到消息CPF4131 某些文件。请参阅作业日志以获取消息的完整说明 CPF4131。如果文件的设备类型为SPECIAL,则可能没有 作业日志中的消息。 &N恢复。 。 。 :输入C取消,输入S到 获得系统存储的打印输出,D获得格式化的RPG 系统存储的打印输出,或按F获得完整格式的打印输出 系统存储。 &N回复消息的可能选择。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 :&B D-获取RPG格式的打印输出 系统存储。 &B S-获取系统存储的打印输出。 &B F- 获取系统存储的全格式打印输出。 &B C-取消。

示例SOMEFILE在ADDFILXS中不存在,而仅在ADDFILXX中,程序调用中从未引用ADDFILXS。

CL程序首先添加必要的库,然后调用RPG,例如:

ADDLIBLE LIB(ADDPRGXX)
MONMSG MsgiD (CPF0000)
ADDLIBLE LIB(ADDFILXX)
MONMSG MsgiD (CPF0000)
CALL TESTRPG

是否需要在以后的RPG调用中使用一些对库的引用? 或者,我应该对连接池做其他事情来防止这种情况吗?

我现在开始为每个库使用2个独立的池,这似乎正在工作。 但更希望找到根本原因并加以解决

解决方法

我怀疑还有更多事情要做(或者您简化了示例)

示例SOMEFILE在ADDFILXS中不存在,而仅在ADDFILXX中存在

但是如果您要得到的话就不可能了

CPF4131对具有成员的库ADDFILXS中的文件SOMEFILE进行级别检查 某些文件

如果SOMEFILE实际上不存在,将会是一条不同的消息。

无论如何,有很多陷阱试图通过在工作生命周期中更改库列表来更改“环境”。由于您已经开始使用连接池,因此连接在IBM i端保持打开状态,因此操作系统在两次使用之间不会重置QZDASOINIT(或相关作业)。

您没有提到或不是在使用ILE或OPM程序。但是每个人都有自己的一套问题,如果将它们混合在一起,情况会变得更糟。 OPM CL调用ILE RPG。

最好的解决方案是您想到的解决方案,针对不同的环境使用单独的池。

不仅更安全,而且性能也会更好。

  • 更改库列表不是“便宜”
  • 允许程序保持活动状态,并打开数据路径保持打开状态。
  • ILE激活组可以在作业中保持活动状态。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?