2017-05-10 66 views
2

我一直在爲建築問題而苦苦掙扎。在一筆交易中插入大量數據

我有DB2 v.9.7數據庫中的表,我需要在單個事務中插入〜250000行,每行13列。我特別需要將這些數據作爲一個工作單元插入。

簡單insert intoexecuteBatch給我:

的事務日誌數據庫已滿。 SQL代碼:-964,SQL狀態:57011

我無權更改事務日誌的大小。所以我需要在開發者方面解決這個問題。

我的第二個想法是在所有插入之前使用保存點,然後我發現它只適用於當前事務,所以它不能幫助我。

任何想法?

+1

您需要將其分解爲更小的工作單元。數據庫告訴你,你不能在一個事務中擁有它們。 – duffymo

+0

使用部分提交來製作存儲過程。 – Zorglube

+0

我知道我需要分解它。所以我會詢問任何JDBC/DB2驅動程序技巧或者可能有幫助的模式。 – megabobik

回答

2

您希望將大插入作爲單個事務執行,但沒有足夠的日誌空間用於此類事務並且沒有足夠的權限來增加它。

這意味着您需要將插入分解爲多個數據庫事務,並在應用程序端管理更高級別的提交或回滾。驅動程序中沒有任何內容(JDBC或CLI)可以幫助解決該問題,因此,如果需要回滾,您將不得不編寫自定義代碼來記錄所有提交的行並手動刪除它們。

另一種替代方法可能是通過ADMIN_CMD()系統存儲過程使用LOAD命令。 LOAD需要較少的日誌空間。但是,爲此,您需要編寫要插入到數據庫服務器上的文件或者可以從服務器訪問的共享文件系統或驅動器的行。

+0

對於使用管理工具的建議+1。 Java很棒,但它不是每個工作的最佳工具。 – duffymo

1

嗨,你可以使用導出/加載命令導出/導入大型表,這應該是非常快的。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');