是否有普遍接受的方法来使用 Java EE 返回大量对象?
例如,如果您有一个包含数百万个对象的数据库 ResultSet,您将如何将这些对象返回到(远程)客户端应用程序?
另一个例子——更接近我实际做的事情——是聚合来自数百个来源的数据,对其进行规范化,然后将其作为单个“列表”逐步传输到客户端系统。
由于内存无法容纳所有数据,我认为结合使用有状态 SessionBean 和某种回调到服务器的自定义 Iterator 可以解决问题。
所以,换句话说,如果我有像 Iterator<Data> getData()
这样的 API那么实现 getData()
的好方法是什么?和 Iterator<Data>
?
您过去是如何成功解决这个问题的?
最佳答案
绝对不要将整个数据库复制到 Java 的内存中。这是没有意义的,只会让事情变得不必要的缓慢和内存占用。而是在数据库级别引入分页。您应该只查询您实际上需要在当前页面上显示的数据,就像 Google 所做的那样。
如果您确实很难正确实现此操作和/或计算特定数据库的 SQL 查询,请查看 this answer .对于 JPA/Hibernate 等效项,请查看 this answer .
根据评论更新(这实际上改变了整个问题主题......),这是一个基本的(伪)启动示例:
List<Source> inputSources = createItSomehow();
Source outputSource = createItSomehow();
for (Source inputSource : inputSources) {
while (inputSource.next()) {
outputSource.write(inputSource.read());
}
}
通过这种方式,您可以有效地在 Java 内存中得到一个条目,而不是整个集合,如以下(低效)示例所示:
List<Source> inputSources = createItSomehow();
List<Entry> entries = new ArrayList<Entry>();
for (Source inputSource : inputSources) {
while (inputSource.next()) {
entries.add(inputSource.read());
}
}
Source outputSource = createItSomehow();
for (Entry entry : entries) {
outputSource.write(entry);
}
关于java - 使用 Java EE 检索大型对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4608804/