首页 > 解决方案 > 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


程序启动,几秒钟后在控制台中返回错误:

{"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


问题:

结构:

存储在数据库中的对象:

@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> {
}

标签: javamysqldatabasespring

解决方案


推荐阅读