Я использую HikariCP 2.3.3 с Spring и Jetty 9 и пытаюсь решить тот факт, что при горячем развертывании нового файла войны все подключения пула базы данных Hikari к MySQL остаются открытыми и неактивными. Я использую поиск JNDI в моем файле приложения Spring для извлечения источника данных из файла контекста Jetty.
Поскольку я не могу указать метод уничтожения в jndi-lookup, как если бы я определял bean-компонент dataSource, я сослался на этот вопрос: Должен ли я закрыть источник данных, полученный JNDI?, где упоминается, что вы можете попытаться закрыть источник данных в методе contextDestroyed() ServletContextListener. В этом случае они использовали tomcat и c3po, поэтому я не уверен, насколько этот пример относится к делу.
Я пробовал следующее в своем методе contextDestroyed:
InitialContext initial;
DataSource ds;
try
{
initial = new InitialContext();
ds = (DataSource) initial.lookup("jdbc/myDB");
if (ds.getConnection() == null)
{
throw new RuntimeException("Failed to find the JNDI Datasource");
}
HikariDataSource hds = (HikariDataSource) ds;
hds.close();
} catch (NamingException | SQLException ex)
{
Logger.getLogger(SettingsInitializer.class.getName()).log(Level.SEVERE, null, ex);
}
Но в HikariDataSource hds = (HikariDataSource) ds; Я получаю следующее исключение: java.lang.ClassCastException: com.zaxxer.hikari.HikariDataSource cannot be cast to com.zaxxer.hikari.HikariDataSource
Я также попробовал следующее после прочтения этой проблемы на GitHub: Обязательно ли вызывать shutdown()
для HikariDataSource? а>:
InitialContext initial;
DataSource ds;
try
{
initial = new InitialContext();
ds = (DataSource) initial.lookup("jdbc/myDB");
ds.unwrap(HikariDataSource.class).close();
} catch (NamingException | SQLException ex)
{
Logger.getLogger(SettingsInitializer.class.getName()).log(Level.SEVERE, null, ex);
}
Но я получаю следующее исключение: java.sql.SQLException: Wrapped connection is not an instance of class com.zaxxer.hikari.HikariDataSource
at com.zaxxer.hikari.HikariDataSource.unwrap(HikariDataSource.java:177)
Я чувствую, что близок к рабочему решению, но не могу его понять. Как правильно закрыть источник данных JNDI HikariCP, будь то в contextDestroyed() или в другом месте?