Как отключить пул соединений при выгрузке контекста?

После разработки нескольких веб-приложений, в которых все были настроены с использованием Spring, Hibernate и C3p0 в качестве пула соединений, я захотел исследовать проблему, которую замечал каждый раз: Connectionpool сохраняет соединения до тех пор, пока вы не отключите Tomcat (или ваш сервер приложений).

Сегодня я создаю самый простой проект, который я могу, с этими четырьмя зависимостями:

org.springframework:spring-web
org.springframework:spring-orm
org.hibernate:hibernate-core
c3p0:c3p0

(плюс определенный драйвер JDBC).

Мой web.xml создает только ContextLoaderListener, который устанавливает контекст приложения.


    contextConfigLocation
    
        /WEB-INF/applicationContext.xml
    



    
        org.springframework.web.context.ContextLoaderListener
    

контекст приложения состоит из двух компонентов - источника данных и фабрики сеансов:


    



    
        org.postgresql.Driver
    
    
        jdbc:postgresql://localhost/mydb
    
    
        usr
    
    
        pwd
    

Когда я запускаю веб-приложение и смотрю в jconsoles MBeans или проверьте мою СУБД на наличие открытых соединений, я заметил три начальных соединения, сделанные c3p0.

ПРОБЛЕМА: Когда я говорю Tomcat, чтобы остановить веб-приложение, они все еще остаются!

Я создал еще один ServletContextListener, в котором реализован только метод contextDestroyed, и он программно завершает работу sessionFactory (а также отменяет регистрацию драйверов JDBC, что также не выполняется автоматически). Код является:

@Override
public void contextDestroyed(ServletContextEvent sce) {

    ...
    sessionFactory().close();

    // deregister sql driver(s)
    Enumeration drivers = DriverManager.getDrivers();
    while (drivers.hasMoreElements()) {
        Driver driver = drivers.nextElement();
        try {
            DriverManager.deregisterDriver(driver);
            log.info("deregistering jdbc driver: " + driver);
        } catch (SQLException e) {
            log.error("error deregistering jdbc driver: " + driver, e);
        }
    }
}

Но так ли это? Нет ли встроенного механизма, о котором я не знаю?

Ответы на вопрос(1)

Ваш ответ на вопрос