Java 在一个事务中插入大量数据

Java 在一个事务中插入大量数据,java,jdbc,db2,db2-luw,Java,Jdbc,Db2,Db2 Luw,我一直在努力解决建筑问题 我在DB2V.9.7数据库中有一个表,我需要在一个事务中插入250000行,每行13列。我特别需要将这些数据作为一个工作单元插入 简单的插入和执行包给我: 数据库的事务日志已满。SQL代码:-964,SQL状态:57011 我无权更改事务日志的大小。所以我需要从开发者的角度来解决这个问题 我的第二个想法是在所有插入之前使用保存点,然后我发现它只适用于当前事务,所以它对我没有帮助 有什么想法吗 您希望将大型插入作为单个事务执行,但没有足够的日志空间用于此类事务,也没有权限

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

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

简单的
插入
执行包
给我:

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

我无权更改事务日志的大小。所以我需要从开发者的角度来解决这个问题

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


有什么想法吗

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

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


另一种选择是通过系统存储过程使用
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');

你需要把它分解成更小的工作单元。数据库告诉您不能在一个事务中包含所有这些内容。请使用部分提交创建一个存储过程。我知道我需要将其分解为多个部分。因此,我询问任何JDBC/DB2驱动程序技巧或可能的模式是否有帮助。@Zorglube“部分提交的过程”是什么意思?@megabobik您创建了一个存储过程,它为25000行的某个块进行提交;对于导入,提交10次。对于使用管理工具的建议,提交+1次。Java很棒,但它并不是每项工作的最佳工具。