0

我遇到了一个问题,即通过传统的绿屏应用程序在 IBM i 上创建的数据没有反映在我正在编写的 Web 应用程序中。我从 Web 应用程序添加的记录似乎可以立即用于 Web 应用程序和 IBM i,但我在 IBM i 上创建的记录不能立即用于 Web 应用程序。我认为这可能是缓存问题,但重新启动我的网络应用程序后,记录仍然不存在。我已经尝试设置javax.persistence.cache.retrieveModeBYPASS,并且该设置在我的 Hibernate 实体管理器创建时得到反映,但是从我的查询返回的数据仍然缺少通过绿屏添加的记录。

在这个阶段,我不认为这是一个缓存问题。所以这是我到目前为止所做的测试。

我正在使用的文件是 WOHDR2 和 WOJOBS,其中 WOHDR2 是头文件,WOJOBS 是详细文件。

这是我到目前为止测试过的。

通过网络应用程序添加到文件 WOJOBS 并立即关联到 WOHDR2 的记录 - 这些记录反映了父 WOHDR2 的 ID 字段,并且在网络应用程序和绿屏中都可见。

通过绿屏应用程序添加到文件 WOJOBS 的记录,没有与 WOHDR2 的 ID 关联,即:它处于挂起状态,直到用户稍后将其分配给 WOHDR2 - 此记录通过绿屏应用程序可见,但网络应用程序不可见

通过绿屏将 WOJOBS 记录关联到 WOHDR2 - 我现在可以通过 Web 应用程序查看 WOJOBS 记录

通过网络应用程序或绿屏应用程序添加到文件 WOHDR2 的记录 - 通过网络应用程序和绿屏应用程序同时显示记录

4

1 回答 1

1

您看不到预期的记录有几个原因。

  1. 你没有读/写同一个文件(表)
  2. 如果您没有看到未提交的记录并且您编写的记录尚未提交,那么您正在隔离级别下运行。
  3. 记录实际上还没有写入表。
  4. 您的 SQL 应用程序正在使用数据的副本,而不是实时数据。

解决方案

  1. 如果使用不合格的引用,请确保两个应用程序都解析到同一个文件。假设 *SYS 命名约定,确保两个应用程序使用相同的库列表。
  2. 查看隔离级别
  3. 如果您使用 RPG 程序从绿屏写入记录,请注意默认情况下,RPG 编译器将在打开文件仅用于输出时缓冲记录。这也称为“记录阻塞”。在缓冲区填满和/或文件关闭之前,不会将记录发送到 DBMS。您经常会看到通过 CHGPF 或 OVRDBF 设置 FRCRATION(1) 来解决此问题。但这是不好的做法。最佳实践是在从 RPGLE 程序返回之前,在您的 RPGLE 程序中使用带有N扩展器的强制数据结束 (FEOD)操作码。这会将 RPGLE 缓冲输出刷新到 DBMS。FEOD(N) mytable;
  4. 如果您的 SQL 在 RPG 应用程序添加数据之前打开游标,则默认允许复制数据 (ALWCPYDTA) = *YES表示您的 Web 应用程序正在处理陈旧数据。您可以在连接级别或通过SET OPTION语句来控制它。

应该注意的是,如果在要写入的表上定义了唯一键,则 RPG 不会缓冲输出;否则 DBMS 将无法确保唯一性。FRCRATIO(1) 是在日志和提交控制之前遗留下来的......它允许您不仅将记录强制到 DBMS,而且一直强制到磁盘。今天打开它是降低应用程序速度的好方法。

于 2016-09-19T17:18:56.747 回答