Я посмотрел спецификацию Servlet 3.0. Он не определяет никаких правил для порядка, в котором должны вызываться методы destroy
. Таким образом, он не указан, и вы не должны полагаться на поведение конкретного поставщика. Вторая причина отказа в освобождении ресурсов, общих для Сервлетов , заключается в том, что данный Сервлет может быть уничтожен в любое время - если контейнер решит это сделать. См. Раздел 2.3.4 спецификации Servlet 3.0:
2.3.4 Окончание срока службы
Контейнер сервлета не требуется для поддержания загруженного сервлета для любого конкретного
промежуток времени. Экземпляр сервлета может оставаться активным в контейнере сервлета для
период в миллисекундах, для срока службы контейнера сервлета (который может быть
количество дней, месяцев или лет) или промежуток времени между ними.
Когда контейнер сервлета определяет, что сервлет должен быть удален из
service, , он вызывает метод уничтожения интерфейса Servlet, чтобы сервлет мог
освободите все используемые им ресурсы и сохраните любое постоянное состояние. Например,
Контейнер может сделать это, когда он хочет сохранить ресурсы памяти или когда это
закрывается
Допустим, у вас есть 3 сервлета - A, B и C. Если A и B полагаются на ресурсы, управляемые C, может случиться так, что контейнер решит временно отключить C, вызвав его метод destroy
. Так что A и B больше не будут иметь доступа к этим ресурсам. Должен признать, я никогда не видел такого поведения в реальности.
Рекомендация:
Использовать ServletContextListener . Гарантируется, что он будет инициализирован и уничтожен только один раз.