1

我有一个从文件加载数据然后尝试将记录插入表中的过程。

如果文件太大,加载 XYZ 表中的所有数据需要一段时间。我正在使用批处理在表中插入记录。

同时,另一个进程启动并尝试根据某些条件从 XYZ 表中读取数据,因为第一个进程尚未完成将数据写入表,而第二个进程尝试读取相同的数据,我得到一个正在使用的对象错误。

我正在考虑解决此问题的两种选择:

  1. 除非所有记录都是由process1插入的,否则保持其中一个状态列不同,这样process2就无法检索记录

  2. 以块的形式插入数据,如果出现问题,有一种机制可以从插入的最后一条记录重试(需要一种机制)。

我正在使用 DB2 和普通 jdbc 来插入记录。

请让我知道解决此问题的最佳方法是什么

4

2 回答 2

1

V4.5 是一个古董,但即使在那时,大多数正常的数据库操作都不需要对文件进行排他锁。听到这里涉及到对象锁,我感到非常惊讶。

我建议稍微修改一下 IBM 方面。像现在一样继续使用 JDBC 将行加载到 DB2 表中,但是当批量加载完成后,将一行加载到新表中。新表中的这一行将触发 IBM 进程去处理完全加载的原始表。IBM 管理员可以使用新表上的触发器来获得新记录到达的通知。

如果无法修改 IBM 端,可以考虑加载一个临时表,然后使用JT400发出 CPYF 命令让 IBM OS 将行复制到真实表中。这应该比通过网络运行得快得多。或者,将其从 TEMPFILE 重命名为 REALFILE,但 IBM 流程可能不喜欢这样。

于 2013-10-08T03:08:53.257 回答
0

您没有说您正在使用什么数据库或库,但您应该考虑使用事务来控制同时读取和写入。进程 1 应该在单个事务中写入数据块。在全部写入之前,这些数据对进程 2 是不可见的,因此您不应该在两者之间产生任何冲突。这是假设您在数据上设置了正确的事务隔离级别。

例如,如果您使用 Spring,那么很容易使用 @Transactional 标记函数,以便 tat 函数中的所有 DB 调用在单个事务中运行。

于 2013-10-07T20:32:29.747 回答