我正在使用 Java 和 Hibernate 的 JPA 实现构建一个数据库 Web 应用程序。应用程序跟踪对象。它还必须从遗留源批量导入对象。
例如,假设我们正在跟踪人员。该数据库有名为 Person 和 Address 的表。有对应的 JPA 实体和 DAO 类。
在 JPA 层之上是负责各种操作的服务层。一个操作是从外部遗留源(例如电话簿中的人)导入一组可能很大的数据。对于每个人,它必须检查它是否已经存在于数据库中。然后它必须根据需要创建或更新人员。每个人都有一个地址,因此还必须进行适当的交叉引用和地址创建。
我的问题是,对于大型数据集,此操作可能会很慢。我目前的算法是:
for (Person person: allPersons)
{
check if person exists in database
check if address exists in database
create or update person and address as necessary
}
你会建议什么来提高性能?
在我的脑海中,我能想到:
- 更改导入逻辑以使用查询检索数据并将其存储到数据库。例如,不是在 for 循环中检查人员是否存在,而是在一个查询中将所有人员键提交到数据库,该过程每个检索到的人员在内存中。
- 在 DAO 类中添加我自己的缓存。
- 使用外部缓存解决方案(例如 memcached)。
我总是可以通过重组以最小化查询来选择#1。缺点是我的服务层现在非常了解 DAO 层。它的实现现在由较低的数据库层决定。还有其他问题,例如使用过多的内存。这种从数据库中抓取然后在内存中处理的方法似乎非常本土化,并且与 JPA 等现成的解决方案背道而驰。我很好奇其他人在这种情况下会怎么做。
编辑:缓存无济于事,因为在循环中被查询的每个人都是不同的。