Я поддерживаю драйвер JDBC, который также имеет встроенный режим сервера базы данных, предоставляемый через собственную библиотеку (доступ через JNA). Завершение работы, выполняемое как часть разгрузки собственной библиотеки, запускается в Windows из-за порядка выгрузки его зависимостей. Чтобы избежать нарушений доступа или других проблем, мне нужно явно отключить встроенный движок до того, как эта библиотека будет выгружена.
Учитывая характер его использования, трудно определить подходящий момент для вызова shutdown, и единственный правильный способ для обычного Java-приложения, который я вижу сейчас, - зарегистрировать крюк остановки с использованием Runtime.getRuntime().addShutdownHook
с подклассом Thread
которая реализует логику выключения.
Это нормально работает для обычного Java-приложения, но для веб-приложений, которые включают мою библиотеку как часть приложения (в WEB-INF/lib
WAR), это приведет к утечке памяти при распаковке, поскольку крюк остановки будет поддерживать сильная ссылка на мою реализацию shutdown и загрузчик классов веб-приложения.
Каким будет подходящий и подходящий способ решения этой проблемы? Параметры, которые я сейчас рассматриваю:
-
С помощью
java.sql.DriverAction.deregister()
выполните очистку.Не подходит, поскольку водитель не будет отменен регистрацией при обычном выходе приложения.
-
Используя
java.sql.DriverAction.deregister()
удалите крюк выключения и выполните логику завершения работы.Использование
DriverAction
немного проблематично, учитывая, что драйвер по-прежнему поддерживает Java 7, и этот класс был представлен в JDBC 4.2 (Java 8). Это технически не всегда правильное использование действия (драйвер JDBC также можно отменить, пока существующие соединения остаются действительными и используются), и возможно, что драйвер используется (черезjavax.sql.DataSource
), а JDBCjava.sql.Driver
не регистрируется. -
Включая реализацию
javax.servlet.ServletContextListener
аннотированную с помощью@WebListener
с драйвером, который удалит крюк отключения и выполнит логику завершения работы.Эта опция имеет сложности, если драйвер развертывается на сервере в целом, а не в конкретном веб-приложении (хотя эти проблемы могут быть решены).
Есть ли механизм отключения в Java, который я забыл, который может быть подходящим для моих нужд?