用Java流式传输大量小对象

时间:2016-12-21 22:32:34

标签: java serialization

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

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

根据我以前的经验,.NET的WCF框架支持

上面的场景
  • transferMode StreamedResponse
  • 返回IEnumerable个对象的能力
  • 借助yield推迟序列化

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以使用ObjectOutputStream / ObjectInputStream来执行此操作 实现这项工作的关键是定期在输出流上调用reset()。如果你不这样做,发送端和接收端将构建一个海量地图,其中包含对流上发送/接收的所有对象的引用。

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

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