试图保存到数据库的StackOverflowException

时间:2018-09-18 10:29:04

标签: java mysql database spring

我有一个问题,有什么特别的地方-项目在14天左右正常工作,直到今天,即30分钟前,我很幸运地一次将他推出了……之后又遇到了问题。

首先,我想证明的是一切都在半小时前完成:

enter image description here

我们可以看到-执行所有进程的运行时间:107411ms(107sec)


所以。 我开发了spring项目,该项目使用JpaRepository接口实现与数据库配合使用。

出现问题,当我尝试从控制台向控制器发送post方法时:

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)注释(在 Structure 部分中显示))

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

  

{“时间戳”:“ 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:

enter image description here


变体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> {
}

0 个答案:

没有答案