我有一个外部服务,我从中获取项目列表,并在本地持有这些项目和用户之间的关系。我为该外部服务提供了一个名称,并获取具有该名称的相关项目。我选择在本地保留它们,因为我希望在我的应用程序发现这些外部项目后保留自己的属性。这些项目本身就是非常静态的对象,但它们的总数对我来说是未知的,而且我唯一一次了解新的项目是新用户是否在外部服务上与它们建立关联。
当我从外部服务中获取它们的列表时,我想首先检查它们是否存在于我的数据库中,然后使用该对象,但如果它没有我需要添加它们以便我可以设置我自己的属性,并保持与我的用户的关联。
现在我有以下内容(伪代码,因为它已经分解为服务层等):
Set<ExternalItem> items = externalService.getItemsForUser(user.name);
for (ExternalItem externalItem : items){
Item dbItem = sessionFactory.getCurrentSession().get(Item.class,item.id);
if (dbitem == null){
//Not in database, create it.
dbItem = mapToItem(externalItem);
}
user.addItem(dbItem);
}
sessionFactory.getCurrentSession().save(user);//Saves the associated Items also.
对于大约500个外部项目,此操作所花费的时间约为16秒。远程操作大约是1秒,并且保存也可以忽略不计。我注意到的消耗来自我正在做的众多session.get(Item.class,item.id)
电话。
有没有更好的方法来检查我的数据库中的现有项目,而不是这个,因为我从外部服务获得了一个Set??
注意:外部项目的ID与我的相同是可靠的,并且单个ID将始终代表相同的外部项目
答案 0 :(得分:1)
我肯定会按照评论中的建议推荐原生查询。
但是,考虑到你所谈论的数字,我不打算把它们分块。 Postgres 应该能够处理包含500个元素的IN
子句,没有任何问题。我已经以编程方式生成了查询,其中包含的项目多于表现良好的项目。
这样你也只有一次往返,假设有适当的索引,真的应该在亚秒内完成。