当前位置: 首页 > 面试题库 >

CRUDRepository的保存方法很慢吗?

商运锋
2023-03-14
问题内容

我想在我的neo4j数据库中存储一些数据。我为此使用spring-data-neo4j。

我的代码如下所示:

    for (int i = 0; i < newRisks.size(); i++) {
        myRepository.save(newRisks.get(i));
        System.out.println("saved " + newRisks.get(i).name);
    }

我的newRisks数组包含大约60000个对象和60000个边。每个节点和边缘都有一个属性。此循环的持续时间大约为15-20分钟,这正常吗?我使用Java
VisualVM搜索一些瓶颈,但是我的平均CPU使用率为10%-25%(4个内核),堆的容量不足一半。

有什么选择可以增强此操作?

编辑: 额外的是,在第一次myRepository.save(newRisks.get(i));的jvm下降assleep fpr
的第一个调用在第一个输出出现前几分钟

第二次编辑:

类别风险:

@NodeEntity
public class Risk {
    //...
    @Indexed
    public String name;

    @RelatedTo(type = "CHILD", direction = Direction.OUTGOING)
    Set<Risk> risk = new HashSet<Risk>();

    public void addChild(Risk child) {
        risk.add(child);
    }

    //...
}

创造风险:

@Autowired
private Repository myRepository;

@Transactional
public Collection<Risk> makeSomeRisks() {

    ArrayList<Risk> newRisks = new ArrayList<Risk>();

    newRisks.add(new Risk("Root"));

    for (int i = 0; i < 60000; i++) {
        Risk risk = new Risk("risk " + (i + 1));
        newRisks.get(0).addChild(risk);
        newRisks.add(risk);
    }

    for (int i = 0; i < newRisks.size(); i++) {
        myRepository.save(newRisks.get(i));
    }

    return newRisks;
}

问题答案:

这里的问题是您正在使用不适合该用途的API进行大量插入。

创建一个Risk和60k子代,首先保存根,该根也同时保留了60k子代(并创建关系)。这就是为什么第一次保存要花这么长时间的原因。然后您再次拯救孩子。

有一些解决方案可通过SDN加快速度。

  1. 不要对大量插入使用收集方法,不要让两个参与者都坚持并使用template.createRelationshipBetween(root,child,“ CHILD”,false);

  2. 首先持久化子级,然后将所有持久化的子级添加到根对象中,并持久化

  3. 像您一样,使用Neo4j-Core API,但调用template.postEntityCreation(node,Risk.class),以便您可以通过SDN访问实体。然后,您还必须自行索引实体(db.index.forNodes(“ Risk”)。add(node,“ name”,name);)(或使用neo4j core-api自动索引,但这不是与SDN兼容)。

  4. 无论使用core-api还是SDN,都应使用大约10-20k节点/ rel的tx大小以获得最佳性能。



 类似资料:
  • 我对Spring数据JPA(Hibernate、PostgreSQL和jdbc)有一个问题。我有两个实体,Texte和Annotation,还有两个存储库,TexteRepository和AnnotationRepository,它们扩展了crudepository。注释与文本具有多对一关系。在控制器中,我会这样做: 执行此操作时,我遇到了一个ConstraintViolationExceptio

  • 如果FreeRADIUS的部署为许多用户进行身份验证和记帐,则必须确保它按预期执行。 您可以从基线速度测试开始,该测试可以在将来用作参考。 要进行速度测试,JRadius Simulator非常理想且易于使用。

  • 问题内容: 已锁定 。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 Java 因其速度慢而享有一定的声誉。 Java真的很慢吗? 如果是,为什么?瓶颈在哪里?是因为JVM效率低下吗?垃圾收集?纯字节码库而不是JNI包装的C代码?许多其他语言都具有这些功能,但是它们并没有因速度慢而享有盛誉。 问题答案: 现代Java是最快的语言之一,即使它仍然是内存消耗大的

  • 问题内容: 我在项目中使用Spring 5。直到今天,仍然有可用的方法。 但是下载最新的快照后,它突然消失了!有没有参考说明该方法现在不可用? 我的依赖项列表: 更新: 似乎此方法已被替换为 问题答案: 请参阅与该提交关联的DATACMNS-944,它具有以下重命名

  • 问题内容: 我有两张桌子。一个是在用户ID上带有主键的User表,另一个是使用外键引用该用户表的表。 “用户”表仅具有一个条目(目前),而另一个表则具有一百万个条目。 以下联接使我发疯: 在速度非常快的计算机上,查询耗时12秒,而排序的时间为0.0005秒,而没有排序的时间为0.0005秒。 我在user_id(IDX_14B78418A76ED395)上有一个索引,在user_id和upload

  • 我是JetBrains的PyCharm的超级粉丝,但我确实遇到了一些问题,我想也许我会在这里问一下。 它意外挂起,这种情况经常发生。总的来说,这对我来说有点慢,我想知道一些如何提高IDE性能的技巧 我能解决的唯一办法是去PyCharm- 我的配置:Mac OSX Lion在MacBook Pro(2010年年中)上运行,8GB内存 现在,我明白,如果没有任何快照或更多关于正在发生的事情的信息,诊断