gpt4 book ai didi

java - 将数据追加到 DB2 blob

转载 作者:行者123 更新时间:2023-12-02 04:38:24 26 4
gpt4 key购买 nike

在我的 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 to the BLOB column of a DB2 database table 中建议的方法。似乎还有其他人也有同样的问题:Update lob columns using lob locator .

作为一种解决方法,我目前将所有现有数据读入内存,将新数据追加到内存中,然后将完整数据写回 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) 填充。

关于java - 将数据追加到 DB2 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30475083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com