在一次交易中插入一大量数据

时间:2017-05-10 14:44:54

标签: java jdbc db2 db2-luw

我一直在努力解决建筑问题。

我在DB2 v.9.7数据库中有表,我需要在一个事务中插入~250000行,每行13列。我特别需要将这些数据作为一个工作单元插入。

简单insert intoexecuteBatch给我:

  

数据库的事务日志已满。 SQL代码:-964,SQL状态:57011

我无权更改事务日志的大小。所以我需要在开发人员方面解决这个问题。

我的第二个想法是在所有插入之前使用保存点,然后我发现它仅适用于当前事务,所以它对我没有帮助。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您希望将大型插入作为单个事务执行,但没有足够的日志空间用于此类事务,并且没有权限来增加它。

这意味着您需要将插入分解为多个数据库事务,并在应用程序端管理更高级别的提交或回滚。驱动程序中没有任何内容(JDBC或CLI)可以帮助解决这个问题,因此您必须编写自定义代码来记录所有已提交的行,并在需要回滚时手动删除它们。

另一种选择可能是通过ADMIN_CMD()系统存储过程使用LOAD命令。 LOAD需要的日志空间更少。但是,为此,您需要将要插入的行写入数据库服务器上的文件或可从服务器访问的共享文件系统或驱动器。

答案 1 :(得分:1)

您好可以使用export / load命令导出/导入大表,这应该非常快.LOAD命令不应该使用事务日志。如果您的用户没有权限在服务器上写文件,您可能会遇到问题文件系统。

call SYSPROC.ADMIN_CMD('EXPORT TO /export/location/file.txt OF DEL MODIFIED BY   COLDEL0x09 DECPT, select  * from some_table ' )


call SYSPROC.ADMIN_CMD('LOAD FROM /export/location/file.txt OF DEL MODIFIED BY COLDEL0x09 DECPT, KEEPBLANKS INSERT INTO other_table COPY NO');