Вот краткое описание системы:
- Клиент 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. Это большое дело?