Повреждает ли удаление из таблицы базы данных h2, обрабатываемой Hibernate, таблицу? - PullRequest
1 голос
/ 18 июня 2020

Вот краткое описание системы:

  • Клиент REST java 7 получает jsons и записывает их проанализированный контент в базу данных h2 через Hibernate.
  • Some Pentaho Kettle ETL Spoon 4 напрямую подключаются к одной и той же базе данных для одновременного чтения и удаления большого количества записей.

Это решение отлично работало в нашей тестовой среде, но в производственной среде (где трафик c действительно выше, потому что, конечно, это так) ETL часто выходят из строя со следующей ошибкой

Error inserting/updating row
General error: "java.lang.ArrayIndexOutOfBoundsException: -1"; SQL statement:
DELETE FROM TABLE_A
WHERE COLUMN_A < ?  [50000-131]

, и если я просматриваю базу данных, я действительно вижу, что эта таблица не читается ( по-видимому, потому что она думает, что ее длина -1? ). Код ошибки 50000 предназначен для «Generi c», поэтому бесполезен.

Помимо тривиального «, возможно, h2 не подходит для обработчика событий », у меня думал, что повреждение могло быть вызвано конфликтом между Kettle и Hibernate, или, другими словами, что никто не должен удалять из базы данных, обрабатываемой Hibernate, без его ведома.

Мои вопросы к более опытным, чем я Спящий режим:

  • Правильно ли мое возражение?
  • Следует ли мне перепроектировать свое решение, чтобы также использовать тот же спокойный спящий режим для выполнения удалений?
  • Должен ли я уйти в отставку используя h2 для такой системы?

Спасибо за помощь!

EDIT:

База данных создается простым скриптом sh, который запускает следующий команда, которая в основном использует предоставленный инструмент Shell для подключения к несуществующей базе данных, которая по умолчанию создает ее.

$JAVA_HOME/bin/java -cp *thisIsAPath*/h2database/h2/main/h2-1.3.168-redhat-2.jar org.h2.tools.Shell -user $DB_USER -password $DB_PASSWORD -url jdbc:h2:$DB_FOLDER/Temp_SD_DS_EventAgent<<END

Таким образом, все ее параметры установлены на значения по умолчанию версии 1.3.168. К сожалению, хотя я могу найти текущий URL-адрес , я не могу найти, где искать значения по умолчанию и экспериментальные данные для этой версии.

Я также нашел следующее:

  • В соответствии с учебником When using Hibernate, try to use the H2Dialect if possible., которого я не делал.
  • В руководстве также указано Please note MVCC is enabled in version 1.4.x by default, when using the MVStore. Означает ли это, что cuncurrency по умолчанию отключен / не поддерживается в этом более старом случае, и это проблема?
  • База данных создана с h2 версии 1.3.168, но потребитель использует 1.4.197. Это большое дело?

1 Ответ

1 голос
/ 09 июля 2020

Я не могу прокомментировать достоверность h2 db. Но с точки зрения приложения, я думаю, вам следует использовать механизм блокировки - блокировку Optimisti c или Pessimisti c. Это позволит избежать конфликтных ситуаций. Надеюсь, этот ответ поможет указать в правильном направлении

Статья об Optimisti c и Pessimisti c блокировка

...