java - 使用 Java EE 检索大型对象列表

标签 java jakarta-ee scalability

是否有普遍接受的方法来使用 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/

相关文章:

java - 如何使用 JAX-RS 捕获所有无效 URL?

java - 在 "java spring hibernate"中制作简单的网站太过分了

javascript - 你如何构建 node.js 动态 Web 服务器? (升级服务器恕不另行通知)

scalability - 如何正确处理异步数据库复制?

java - Kotlin 代码的 Robolectric 测试用例

java - 我用 Hibernate/JPA 得到一个 "error, string or binary data would be truncated"

android - 无法从android项目模拟器调用web服务方法

java - 在 rhino (JavaScript) 的 Java 方法上使用 .apply()

java - 我的 JavaFX 计时器不工作。为什么?

amazon-ec2 - 使用 aws sdk 命令行进行自动缩放的 Cloud Formation