- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想在我的 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);
}
我的新风险数组包含大约 60000 个对象和 60000 条边。每个节点和边都有一个属性。此循环的持续时间约为 15 - 20 分钟,这正常吗?我使用 Java VisualVM 来搜索一些瓶颈,但我的平均 CPU 使用率为 10 - 25%(4 个内核),而且我的堆还不到一半。
有什么选项可以提高这个操作?
编辑:另外,在第一次调用 myRepository.save(newRisks.get(i));
时,jvm 在第一次输出前几分钟进入休眠状态来了
第二次编辑:
类风险:
@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 个 child ,您首先保存了根,它同时保留了 60k 个 child (并创建了关系)。这就是第一次保存需要这么长时间的原因。然后你又救了 children 。
有一些解决方案可以通过 SDN 加速它。
不要使用集合方法进行批量插入,保留两个参与者并使用 template.createRelationshipBetween(root, child, "CHILD",false);
先持久化子对象,然后将所有持久化的子对象添加到根对象并持久化
像您一样,使用 Neo4j-Core API 但调用 template.postEntityCreation(node,Risk.class) 以便您可以通过 SDN 访问实体。然后你还必须自己索引实体 (db.index.forNodes("Risk").add(node,"name",name);)(或使用 neo4j core-api auto-index,但那不是兼容 SDN)。
无论使用 core-api 还是 SDN,您都应该使用大约 10-20k 节点/rels 的 tx 大小以获得最佳性能
关于java - CRUDRepository 的保存方法很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9568203/
我正在阅读 JPA docs在 Spring ,我正在尝试重组我的代码。 我现在所拥有的: BrewerRepository @Repository public class BrewerReposi
我正在使用 Maven 开发一个 Spring Boot 项目(由 Spring Initializr 生成)。我想创建一个 CrudRepository,但我收到错误“CrudRepository
是否可以为 CrudRepository 添加默认排序方法?喜欢: interface PersonRepository extends CrudRepository { @SortDefaul
我创建了一个像这样的计划类 计划: @Entity(name = "Plan") @Data @NoArgsConstructor @AllArgsConstructor @EqualsAndHash
我有以下实体 请求对象 AdditionalReqObj。 两个实体均与 REQ_ID 链接表中的列(reqId 字段)。我正在使用Spring data CrudRepository interfa
我有两个实体客户和订单: @Entity public class Customer { @Id @GeneratedValue(strategy=GenerationType.IDENTIT
我的行为很奇怪。我创建了扩展 CrudRepository 的存储库。除保存方法外,所有默认方法都可以正常工作。它不会将新实体保存到数据库。我需要使用我提供的 id 保存新实体。如果我在数据库中提供现
我的域名和日期字段已更新,我想搜索 @Column(name = "updated") Date updated; 我有一个代表一天的 Java Date 对象,它由我的端点的 Controller
我有表格绑定(bind) @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "boundId", unique =
我使用 spring boot 1.2.5.RELEASE。我定义了一个扩展 CrudRepository 的接口(interface) public interface SampleEntitySe
我正在阅读有关 Crudrepository 的信息,它是针对特定类型的存储库进行通用 CRUD 操作的接口(interface)。 但我们可以创建自定义界面并扩展 CrudRepository。 我
我正在使用 Spring 并在其中 spring-data-jpa:1.7.0.RELEASE 和 hibernate-jpa-2.1-api:1.0.0.Final。我的数据库是MySQL。在集成测
我想显示一张人员表。用户应该能够发送查询并按大多数可选的属性进行过滤。 问题:对于每个要过滤的属性,我必须在 spring-data-jpa 中使用 `CrudRepository 引入一个额外的方法
我是 Spring 的新手。我的 GCGood 类使用 CrudRepository 保存到 MySQL-DB。而且效果很好。 现在我尝试编写 JUnit 测试。当然,我不希望任何测试数据出现在我的数
请原谅我犯的任何错误,因为这是我在这里的第一个问题。 我有一个包含两个表的数据库,其中一个表名为:PERSON 具有以下实体: @Entity class Person { @Id p
我有一个基本的 SpringBoot 应用程序。使用 Spring Initializer、JPA、嵌入式 Tomcat、Thymeleaf 模板引擎,并打包为可执行 JAR 文件。我创建了这个 Re
我想在我的 neo4j 数据库中存储一些数据。为此,我使用 spring-data-neo4j。 我的代码如下: for (int i = 0; i risk = new HashSet()
我使用 Angular、SpringBoot 和 MySQL 数据库构建了一个应用程序。它使用 CrudRepository 但我不明白它(一切正常)。 Controller /存储库如何知道从哪个表
我正在尝试获取对我的存储库接口(interface) (UserRepository) 的引用,该接口(interface)按顺序在我的自定义实现 (UserRepositoryExtensionIm
我有两个具有@ManyToOne 关系的实体类,如下所示。 @Entity public class Student { @Id private Integer studentId; @C
我是一名优秀的程序员,十分优秀!