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