java - StackOverflowException 试图保存到数据库
问题描述
我有一些问题,有什么特别之处 - 项目在 14 天左右正常运行,今天,30 分钟前,我幸运地启动了他一次......之后又出现了问题。
首先,我要补充的是半小时前一切正常的证据:
我们可以看到 - 执行所有进程的运行时间:107411ms(107sec)
所以。我开发了 spring 项目,它与使用 JpaRepository 接口实现的数据库一起工作。
当我尝试从控制台将发布方法发送到控制器时遇到问题:
curl -d '{"explorerId":'24', "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/vdtw
变体 1
- “变体 1”(在实体中带有 @ManyToOne(cascade = CascadType.ALL, fetch = FetchType.EAGER) 注释(在结构部分中显示))
程序启动,几秒钟后在控制台中返回错误:
{"timestamp":"2018-09-18T10:01:08.343+0000","status":500,"error":"内部服务器错误","message":"无可用消息","path":" /vdtw"}
在 IDEA 控制台中抛出错误:**StackOverflowException: null* with preview:
* java.lang.instrument ASSERTION FAILED * : "!errorOutstanding" with message transform method call failed at JPLISAgent.c line: 844
2018-09-18 13:01:08.306 错误 25853 --- [nio-8080-exec-1] oaccC[.[.[/].[dispatcherServlet]:Servlet.service() 用于 servlet [dispatcherServlet] path [] 抛出异常 [Handler dispatch failed; 嵌套异常是 java.lang.StackOverflowError] 的根本原因
原则:
变体 2 (使用 fetch = FetchType.LAZY,未设置 CascadType)
在这种情况下,程序可以正常运行,但是时间很长(10 分钟以上):
生成空缺描述词,解析14885个词。时间:621304
问题:
为什么程序正常运行了14天,现在开始抛出StackOverflowException?
如何优化结构以更快地存储数据库中的实体?
结构:
存储在数据库中的对象:
@Entity(name = "vacancy_desc_to_words")
public class VacancyDescriptionToWords {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@JoinColumn(name = "vacancy_description_id")
@ManyToOne(cascade = CascadeType.ALL)
private VacancyDescription vacancyDescription;
@JoinColumn(name = "words_id")
@ManyToOne(cascade = CascadType.ALL);
//------------------Second variant---------------------------
//@ManyToOne
private Words words;
}
由 ManyToOne 实体链接:
@Entity(name = "words")
public class Words {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "word", unique = true)
private String word;
@JsonIgnore
@OneToMany(mappedBy = "words", fetch = FetchType.EAGER, CascadType.ALL)
//---------------------Second variant----------------------
//@OneToMany(mappedBy = "words", fetch = FetchType.LAZY)
private Set<VacancyDescriptionToWords> vacancyDescriptionToWordsSet;
//getters/setters
}
Pom.xml:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
放在出现问题的代码中
List<VacancyDescriptionToWords> vdtwList = VDTWService.parseAndGenerateNewDescToWords(vacancyDescriptions);
//--------------- exception string ----------------------
VDTWService.saveAll(vdtwList);
保存实体列表的方式:
public void saveAll(List<VacancyDescriptionToWords> vdtwList) {
vdtwRepository.saveAll(vdtwList);
}
存储库:
public interface VDTWRepository extends JpaRepository<VacancyDescriptionToWords, Long> {
}
解决方案
推荐阅读
- flutter - 如何实现自定义微调器以在颤动中选择时间
- css - 如何通过 select2 显示完整的大文本选项(没有水平滚动)?参考图片
- php - 具有多态关系的 Laravel 全局访问
- python - GeoPandas 地图:以国家为中心(并在经度 180 度处加入分割几何图形)
- reactjs - 在react redux和saga中调度完成后获取状态变量?
- python - on_click(x, y, button, pressed) 不起作用,分配前引用了局部变量“pressed”
- kubernetes - 如何解决谷歌云上的“所有主机都被其他资源占用”?
- xcode - 无法在 Big Sur 上构建 Racket 7.9
- javascript - 悬停事件上的谷歌图表自定义图例
- c# - Keyset(Seek) 分页和 MongoDb 驱动程序 C#