簡體   English   中英

將數據附加到DB2 Blob

[英]Append data to a DB2 blob

在我的DB2數據庫中,我有一個帶有Blob的表:

CREATE TABLE FILE_STORAGE (
    FILE_STORAGE_ID integer,
    DATA blob(2147483647),
    CONSTRAINT PK_FILE_STORAGE PRIMARY KEY (FILE_STORAGE_ID));

使用db2jcc JDBC驅動程序(db2jcc4-9.7.jar),我可以毫無問題地讀取和寫入該表中的數據。

現在,我需要能夠將數據追加到現有的行中,但是DB2給出了神秘的錯誤

Invalid operation: setBinaryStream is not allowed on a locator or a reference. ERRORCODE=-4474, SQLSTATE=null

我使用以下代碼追加數據:

String selectQuery = "SELECT DATA FROM FILE_STORAGE WHERE FILE_STORAGE_ID = ?";
try (PreparedStatement ps = conn.prepareStatement(selectQuery, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE)) {
    ps.setInt(1, fileStorageID);
    try (ResultSet rs = ps.executeQuery()) {
        if (rs.next()) {
            Blob existing = rs.getBlob(1);
            try {
                // The following line throws the exception:
                try (OutputStream output = existing.setBinaryStream(existing.length() + 1)) {
                    // append the new data to the output:
                    writeData(output);
                } catch (IOException e) {
                    throw new IllegalStateException("Error writing output stream to blob", e);
                }

                rs.updateBlob(1, existing);
                rs.updateRow();
            } finally {
                existing.free();
            }
        } else {
            throw new IllegalStateException("No row found for file storage ID: " + fileStorageID);
        }
    }
}

我的代碼使用的是OutputStream中建議的方法到DB2數據庫表的BLOB列 似乎還有其他人也有相同的問題: 使用lob locator更新lob列

解決方法是 ,我目前將所有現有數據讀入內存,將新數據追加到內存中,然后將完整數據寫回到Blob。 這可以工作,但是非常慢,而且如果blob中有更多數據,顯然會花費更長的時間,每次更新都會變得更慢。

我確實需要使用Java來更新數據,但是除了切換到JVM外,我很樂於嘗試所有可能的替代方法,我只需要以某種方式附加數據即可。

預先感謝您的任何想法!

如果只需要將數據追加到BLOB列的末尾,並且不想將整個值讀入程序,則簡單的UPDATE語句將更快,更直接。

您的Java程序可以通過executeUpdate()運行類似的內容:

UPDATE file_storage SET data = data || BLOB(?) WHERE file_storage_id = ?

為此的參數標記將由setBlob(1, dataToAppend)setInt(2, fileStorageID)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM