@DJFRX

Как пофиксить дедлоки и таймауты во время транзакций сохранения данных в базу при многопоточности от ForkJoinPool?

У меня есть поисковый движок по локальным сайтам. У меня есть LemmaService, который вполняет функции сохранения лемм в базу данных. Однако, сохранение в методе saveLemmasAndIndexes выполняется около 300 секунд при сохранении лишь 2000 сущностей за раз. Такого быть не должно. + Часто пишутся ошибки-дедлоки, например: 2024-04-28 18:26:38 ERROR jdbc.batch:293 - HHH100501: Exception executing batch [java.sql.BatchUpdateException: Deadlock found when trying to get lock; try restarting transaction], SQL: update lemma set frequency=?,lemma=?,site_id=? where id=?
Я вызываю метод getAndSaveLemmasAndIndexes вызывается из ForkJoinPool после сохранения страниц
Вы можете посмотреть исходный код LemmaService здесь: https://pastebin.com/dZ4zcWcp
Так же посмотрите https://pastebin.com/diQSPpw0 - это рекурсивный сайт, расширяющий RecursiveAction, откуда вызывается getAndSaveLemmasAndIndexes (он является точкой входа в LemmaService)
Так же вам может помочь структура базы данных MySql: https://pastebin.com/N7sT8kbU.
Так же хочу уточнить, что скорость сохранения других сущностей вполне нормальная и дедлоки отсутствуют
Буду безумно благодарен за помощь, уже больше недели вожусь с этим
  • Вопрос задан
  • 210 просмотров
Пригласить эксперта
Ответы на вопрос 1
xez
@xez Куратор тега Java
TL Junior Roo
Попробуйте отказаться от апдейтов. Это и быстрее и безопаснее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы