我有一个问题,有什么特别的地方-项目在14天左右正常工作,直到今天,即30分钟前,我很幸运地一次将他推出了……之后又遇到了问题。
首先,我想证明的是一切都在半小时前完成:
我们可以看到-执行所有进程的运行时间:107411ms(107sec)
所以。 我开发了spring项目,该项目使用JpaRepository接口实现与数据库配合使用。
curl -d '{"explorerId":'24', "turnOff":true}' -H "Content-Type: application/json" -X POST http://localhost:8080/vdtw
变体1
程序启动,几秒钟后在控制台中返回错误:
{“时间戳”:“ 2018-09-18T10:01:08.343 + 0000”,“状态”:500,“错误”:“内部 服务器错误”,“消息”:“无消息”,“路径”:“ / vdtw”}
在IDEA控制台中引发错误:** StackOverflowException:null * 预览:
* java.lang.instrument ASSERTION FAILED * :JPLISAgent.c行:844上带有消息转换方法调用的“!errorOutstanding”失败
2018-09-18 13:01:08.306错误25853 --- [nio-8080-exec-1] o.a.c.c.C。[。[。[/]。[dispatcherServlet]:的Servlet.service() 路径[]中的servlet [dispatcherServlet]抛出异常 [处理程序派遣失败;嵌套异常为 java.lang.StackOverflowError]的根本原因
prinscrn:
变体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> {
}