StackOverflowException при попытке сохранить в базе данных - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть какая-то проблема и что особенного - проект работал правильно около 14 дней, и сегодня, 30 минут назад, мне повезло запустить его один раз ... и после этого снова возникла проблема.

Для началаЯ хочу добавить, это доказательство того, что все работало полчаса назад:

enter image description here

Видно - время выполнения всего процесса: 107411мс (107сек)


Итак.Я разработал весенний проект, который работает с базой данных, используя реализацию интерфейса 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) в сущности (показан в Структура раздел))

программа запускается и через несколько секунд возвращает ошибку в консоли:

{"отметка времени": "2018-09-18T10: 01: 08.343+0000 "," status ": 500," error ":" Internal Server Error "," message ":" Сообщение недоступно "," path ":" / vdtw "}

В IDEAошибка выброса консоли: ** StackOverflowException: null * с предварительным просмотром:

* java.lang.instrument СБОЙ СБОРА *: "! errorOutstanding" с ошибкой вызова метода преобразования сообщения в JPLISAgent.c строка: 844

2018-09-18 13: 01: 08.306 ОШИБКА 25853 --- [nio-8080-exec-1] oaccC [. [. [/]. [dispatcherServle]t]: Servlet.service () для сервлета [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> {
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...