В ссылке Hibernate указано несколько раз, что
Все исключения, сбрасываемые Hibernate, являются фатальными. Это означает, что вам нужно откатить транзакции базы данных и закройте текущий
Session
. Вам разрешено продолжить работая сSession
, которая выбрала исключение.
В одном из наших устаревших приложений используется один сеанс для обновления/вставки многих записей из файлов в таблицу DB. Каждое обновление/вставка записи выполняется в отдельной транзакции, которая затем фиксируется (или откатывается в случае возникновения ошибки). Затем для следующей записи открывается новая транзакция и т.д. Но тот же сеанс используется в течение всего процесса, даже если HibernateException
был пойман в середине обработки. Мы используем Oracle 9i btw с Hibernate 3.24.sp1 на JBoss 4.2.
Прочитав вышеприведенное в книге, я понял, что этот проект может потерпеть неудачу. Поэтому я реорганизовал приложение для использования отдельного сеанса для каждого обновления записи. В unit test с макетным сеансом factory я могу проверить, что он теперь запрашивает новый сеанс для каждого обновления записи. Пока что так хорошо.
Однако мы не обнаружили способа воспроизвести сбой сеанса при тестировании всего приложения (это будет стресс-тест btw или...?). Мы думали о том, чтобы отключить слушателя БД, но мы поняли, что приложение поддерживает связку открытых для БД связей, и слушатель не повлияет на эти соединения. (Это веб-приложение, которое активируется каждую ночь планировщиком, но оно также может быть активировано через браузер.) Затем мы попытались убить некоторые из этих соединений в БД, пока приложение обрабатывало обновления - это привело к некоторым неудачным обновления, но затем приложение с радостью продолжало обновлять остальные записи. По-видимому, Hibernate достаточно умен, чтобы снова открыть сломанные соединения под капотом, не нарушая всю сессию.
Таким образом, это не может быть критической проблемой, поскольку наше приложение кажется достаточно надежным даже в его первоначальной форме. Тем не менее, проблема продолжает меня бить. Я хотел бы знать:
- В каких обстоятельствах сеанс Hibernate действительно становится непригодным после того, как был сброшен
HibernateException
( Обновление: и каковы симптомы)? - Как воспроизвести это в тесте ( Обновление: желательно в интеграции, а не unit test)?
- (Какой правильный термин для такого теста?)