如何将二进制数据附加到HSQL(2.3.2)blob?

时间:2014-10-08 14:56:32

标签: java blob hsqldb

我正在使用 HSQL 2.3.2 ,我有一个像这样的表结构:

create table test (name varchar(255), data blob);

我知道如何将二进制数据插入表中:

// ... insert omitted ...
PreparedStatement ps = connection.prepareStatement("update test set data = ? where name = 'chris'");

final Blob bb = connection.createBlob();

final OutputStream out = bb.setBinaryStream(bb.length()+1);
out.write(("[test "+System.currentTimeMillis()+"]").getBytes("UTF-8"));
out.flush();
out.close();

ps.setBlob(1,bb);

ps.execute();

可以使用ps.setBinaryStream(1,...);好吧。

如何在现有blob中添加/追加数据?我试过:

Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("select * from test where name = 'chris'");

if(rs.next())
{
    Blob b = rs.getBlob("data");
    if(b!=null)
    {
    System.out.println("Blob size: " + b.length());

    System.out.println("content: " + StringUtils.asString(b.getBinaryStream()));

    final OutputStream out = b.setBinaryStream(b.length());
    out.write(("[test "+System.currentTimeMillis()+"]").getBytes("UTF-8"));
    out.flush();
    out.close();

    System.out.println("Blob size after write: " + b.length());

}
else
{
    System.out.println("no blob found.");
}

但我得到的是:

Blob size: 20
content: [test 1412778939148]
Exception in thread "main" java.sql.SQLFeatureNotSupportedException: feature not supported
    at org.hsqldb.jdbc.JDBCUtil.notSupported(Unknown Source)
    at org.hsqldb.jdbc.JDBCBlobClient.setBinaryStream(Unknown Source)
    at aniclo.server.STest.main(STest.java:73)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

所以这意味着HSQL不支持追加数据?或者我错过了什么? 似乎有一个JDBCBlobClient类提到它使用指向blob的指针而不是内存中的二进制数组表示。有人可以告诉我如何使用这个课程吗?

我的应用程序必须支持附加数据。所以我现在想到的解决方法就是创建一个表并将所有数据块放在那里(比如postgres LOB表),一旦我把所有数据块附加在一起并将它们移到最终表中,在考虑时已经让人头疼它...

谢谢,

1 个答案:

答案 0 :(得分:0)

HSQLDB支持更新数据并将数据附加到blob。而不是Blob.setBinaryStream(...)使用Blob.setBytes(...)。