首页 > 解决方案 > 使用 Streams 和 Gson 将作为 ResultSet 读取的大量数据库转换为 JSON 字符串的最佳方法?

问题描述

我有一个来自 DB 对象的大结果,我想将其转换为 json 字符串并作为消息传递给 pubsub。我是 Java 8 流的新手,我不知道使用它的最佳方法是什么。我通常使用 new Gson().toJson(myArrayList.toArray(), T[].class),但我想避免在内存中存储大对象,因此避免将 ArrayList 作为建议的答案之一。

标签: javajava-8java-streamgson

解决方案


鉴于您的 arraylist 已经是一个巨大的对象,您试图避免的是,最坏的情况是 2 倍的常数因子(您需要 2 倍您现在已经需要的内存)。换句话说,在这里尝试流式传输 JSON 是没有意义的。

如果您有一个从某个地方一次读取一个的对象流(例如,您正在遍历数据库结果集并将每个“行”转换为一个对象,例如使用 JOOQ 或 JDBI 或休眠),并且您想要发送这些是通过 JSON 输出的),那么你想要的就很有意义了。

换句话说,建议是:不要打扰,你不会得到任何有用的东西。如果你想花时间让这段代码占用更少的内存,那么回到最终生成一个巨大数组列表的代码并将其更改一个流(小写的 s。可能是一个实际的 java.util.stream。流,但更可能是迭代器或只是不同的代码结构)。

然后才担心 JSON 部分。完成此操作后,请调查有关流式传输 GSON 的此 wiki 页面


推荐阅读