gpt4 book ai didi

java - 如何使用 Kryo 将非常大的 Java 对象保存到 Oracle 中的 Blob 中并避免 KryoException 缓冲区溢出?

转载 作者:行者123 更新时间:2023-11-30 06:12:36 25 4
gpt4 key购买 nike

我正在尝试使用 Kryo 保存一个非常大的对象,

public static byte[] toBytes(KryoPool kryoPool, Object object) {
try (Output output = new Output(32768, Integer.MAX_VALUE - 8)) {
kryoPool.run(kryo -> {
kryo.setReferences(false);
kryo.writeObject(output, object);
return null;
});
return output.toBytes();
}
}

我得到了异常:

com.esotericsoftware.kryo.KryoException: Buffer overflow. Available: 0, required: 1
at com.esotericsoftware.kryo.io.Output.require(Output.java:167)
at com.esotericsoftware.kryo.io.Output.writeByte(Output.java:225)
at com.esotericsoftware.kryo.Kryo.writeObjectOrNull(Kryo.java:623)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:86)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:508)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:651)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.write(CollectionSerializer.java:100)
at com.esotericsoftware.kryo.serializers.CollectionSerializer.write(CollectionSerializer.java:40)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:575)
at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:79)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:508)
at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:557)

这个字节数组应该保存到 Oracle 表的 Blob 字段中。我现在意识到两件事:

  1. byte[]的大小有限制,不能大于2^31-1?我应该如何处理大于 max 尺寸的非常大的物体。字节数组?
  2. 如何避免Kryo Buffer溢出异常?

更新:多谢。我只是想知道在哪一点我应该调用 Kryo 序列化:

    try (final PreparedStatement pstmt = conn.prepareStatement("INSERT INTO DATA_STORAGE (ID, VALUE) VALUES (?, ?)")) 
{
final Blob blob = conn.createBlob();
OutputStream out = blob.setBinaryStream(0L);

Output output = new Output(out);

pstmt.setInt(1, id);
pstmt.setBlob(2, blob);

//probably here?
kryoPool.run(kryo -> {
kryo.setReferences(false);
kryo.writeObject(output, object);
return null;
});

pstmt.executeUpdate();
}

最佳答案

不要创建中间byte[],而是直接流式传输到 BLOB:

try (Output output = new Output(blob.setBinaryStream(0L))) {
....
}

关于java - 如何使用 Kryo 将非常大的 Java 对象保存到 Oracle 中的 Blob 中并避免 KryoException 缓冲区溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49906504/

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