【问题标题】:Streaming large number of small objects with Java使用 Java 流式传输大量小对象
【发布时间】:2016-12-22 07:27:18
【问题描述】:

需要在Java 中实现客户端和服务器应用程序。该场景需要从服务器端的数据库中读取大量小对象并发送给客户端。

  • 这与传输大文件无关,而是需要将大量小对象流式传输到客户端。
  • 需要在单个请求中从服务器发送到客户端的对象数量可能是一百万或一百万(为了讨论,我们假设客户端的数量是有限的 - 忽略限制)。
  • 在大多数情况下,对象的总大小太大而无法将它们保存在内存中。一种将服务器端的读取和发送操作推迟到需要客户端请求对象的方法。

根据我之前的经验,.NET的WCF框架支持上面的场景

  • transferModeStreamedResponse
  • 能够返回 IEnumerable 个对象
  • 借助yield延迟序列化

是否有一个 Java 框架可以根据对象的请求流式传输对象,同时保持与客户端的连接打开?

注意:这听起来像是一个非常笼统的问题,但我希望提供具体的细节,希望能得到一个明确的答案,使我和其他可能的人受益。

【问题讨论】:

  • 因此,为了提高效率,不要让 Java 服务器请求数据,然后它会代表某个客户端进行序列化......为什么不简单地拥有一个客户端可以请求的 REST 服务器它的对象直接?是的,该框架被称为 Java EE,除了没有与客户端打开连接(无论如何您真的不想计划;这样的策略是非常不可扩展的)。

标签: java serialization


【解决方案1】:

一种标准的方法是使用一种分页形式,并以块的形式获取结果,这些块可以临时存储在内存中。具体如何做取决于它,但基本的 JDBC 方法是首先执行一条语句以找出记录的数量,然后将它们分成块。例如,Oracle 有一个 ROWNUM 列,您可以使用它来管理要返回的记录范围。其他数据库有一些其他选项。

【讨论】:

    【解决方案2】:

    您可以使用 ObjectOutputStream / ObjectInputStream 来执行此操作。
    完成这项工作的关键是定期在输出流上调用reset()。如果您不这样做,发送端和接收端将构建一个庞大的映射,其中包含对通过流发送/接收的所有对象的引用。

    但是,长时间保持单个请求/响应(或数据库游标)打开可能会出现问题。并且恢复失败的流可能会出现问题。因此,您的解决方案可能应该将上述内容与某种分页相结合。

    另外需要注意的是,可扩展的解决方案需要避免网络延迟成为瓶颈。可能值得实现一个接收线程,该线程急切地从流中提取对象并将它们缓冲在(有界)队列中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-23
      • 2013-11-14
      • 2020-11-18
      • 2010-12-12
      • 2012-07-29
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      相关资源
      最近更新 更多