Java 使用存储过程时数据库中的对象锁定问题

Java 使用存储过程时数据库中的对象锁定问题,java,jdbc,db2,prepared-statement,ibm-midrange,Java,Jdbc,Db2,Prepared Statement,Ibm Midrange,我有一个进程,它从文件加载数据,然后尝试将记录插入表中 如果文件太大,则需要一段时间才能加载XYZ表中的所有数据。我正在使用batch在表中插入记录 同时,另一个进程启动,并尝试根据某个条件从XYZ表中读取数据,因为第一个进程尚未完成向表中写入数据,而第二个进程尝试读取相同的数据,所以我得到一个使用中的对象错误 我正在考虑两种解决此问题的方法: 除非process1插入了所有记录,否则请保持其中一个状态列不同,以便process2无法检索记录 将数据分块插入,如果出现故障,请使用一种机制从最后插

我有一个进程,它从文件加载数据,然后尝试将记录插入表中

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

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

我正在考虑两种解决此问题的方法:

  • 除非process1插入了所有记录,否则请保持其中一个状态列不同,以便process2无法检索记录

  • 将数据分块插入,如果出现故障,请使用一种机制从最后插入的记录重试(需要一种机制)

  • 我使用DB2和普通jdbc插入记录


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

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


    例如,如果您使用的是Spring,那么很容易将函数标记为@Transactional,这样tat函数中的所有DB调用都可以在一个事务中运行。

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


    例如,如果您使用的是Spring,那么很容易将函数标记为@Transactional,这样tat函数中的所有DB调用都可以在一个事务中运行。

    V4.5是一个古老的版本,但即使在那时,大多数普通DB操作也不需要对文件进行独占锁定。听说这里有一个对象锁,我很惊讶

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


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

    V4.5是一个古老的版本,但即使是在很久以前,大多数正常的DB操作也不需要对文件进行独占锁定。听说这里有一个对象锁,我很惊讶

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


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

    另一个选项是在一个事务中执行所有插入,这样,在加载过程完成之前,其他人不会看到插入。顺便问一下:您使用的是哪种数据库管理系统?博士后?Oracle?我使用DB2,我使用普通jdbc在DBA中插入记录。另一种选择是在一个事务中执行所有插入,这样,在加载过程完成之前,其他人不会看到插入。顺便问一下:您使用的是哪种数据库管理系统?博士后?Oracle?我使用DB2和纯jdbc在数据库中插入记录我使用一个事务插入所有内容,因为数据太大,它以某种方式锁定了整个文件,即表,因此当下一个预定进程运行时,它无法从该表中检索任何内容,bcz系统说文件正在使用中。@Abs:你是说大量插入导致DB2中的表锁吗?那太差劲了。那是哪个DB2版本?我认为在较新的版本中,读卡器永远不会被写卡器阻塞。我使用的是DB2ISeriesV4.5。插入的记录百分比是多少?每个进程使用什么隔离级别?这两个进程都是指一个物理文件(表),还是涉及一个逻辑文件或索引?@WarrenT:我正在插入100000条记录。隔离级别已读取并提交。两个进程都指向物理文件。我使用一个事务插入所有内容,因为数据太大,它以某种方式锁定了整个文件(即表),因此,当下一个计划进程运行时,它无法从该表中检索任何内容,bcz系统说文件正在使用中。@Abs:你是说大量插入导致DB2中的表锁吗?那太差劲了。那是哪个DB2版本?我认为在较新的版本中,读卡器永远不会被写卡器阻塞。我使用的是DB2ISeriesV4.5。插入的记录百分比是多少?每个进程使用什么隔离级别?这两个过程都是r吗