我正在使用Java和Hibernate的JPA实现构建数据库Web应用程序。应用程序跟踪对象。它还需要从传统源批量导入对象。批量导入大型数据集时的数据库性能建议
例如,假设我们正在跟踪的人。该数据库具有名为个人和地址的表。有相应的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循环中是否存在person,而是在一个查询中将所有person key提交给数据库,每个进程检索内存中的person。
- 在DAO类中添加我自己的缓存。
- 使用外部缓存解决方案(如memcached)。
我能#1通过重组以减少查询始终走。缺点是我的服务层现在非常了解DAO层。它的实现现在由较低的数据库层决定。还有其他问题,如使用太多的内存。这种从数据库中获取内存然后在内存中进行处理似乎非常有用,并且不符合JPA等现成的解决方案。我很好奇别人在这种情况下会做什么。
编辑:缓存将不利于为每个人所内环路查询是不同的。
其中一个原因是冲洗不总是释放内存的是,hibernate将存储对事务中保存的所有对象的引用,以便它可以在事务结束时调用对象上的提交挂钩(如果有的话)。 – davidsheldon 2009-01-04 10:04:52