我有一个外部服务,可以从中获取项目列表,并在本地保持这些项目与用户之间的关系。我为该外部服务提供了一个名称,然后取回了具有该名称的关联项目。我之所以选择本地保留它们,是因为一旦我的应用程序发现了这些外部项目,我想保留自己的属性。这些项目本身是非常静态的对象,但是它们的总数对我来说是未知的,而且我唯一了解新项目的是新用户在外部服务上是否与它们有关联。
当我从外部服务获得它们的列表时,我想先检查它们是否存在于数据库中,然后使用该对象,但是如果不需要,则需要添加它们,以便设置自己的属性并保留与我的用户的关联。
现在我有以下内容(伪代码,因为它被分解成服务层等):
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,是否有比这里更好的方法来检查数据库中的现有Item?
注意:外部项目的ID与我的外部ID一样可靠,并且单个ID始终代表相同的外部项目
我绝对会推荐本地查询,如评论中所建议。
但是,鉴于您正在谈论的数字,我不会打扰他们。Postgres应该能够处理IN
500个元素的子句,而不会出现问题。我用程序生成的查询包含的项目比执行得还好的项目多得多。
这样,您也只有一次往返,假设已建立适当的索引,则实际上应该在不到一秒的时间内完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句