Hibernate: закрытие фабрики сеанса не закрывает пул соединений c3p0

Недавно я начал использовать hibernate вместе с c3p0 в качестве ORM в своем приложении. Однако, когда я закрываю фабрику сеансов, пул соединений не закрывается сам! Этоединственное место в моем приложении, где я делаю что-нибудь с сеансом.

    StatelessSession session = null;
    Transaction transaction = null;


    try {
        session = sessionFactory.openStatelessSession();
        transaction = session.beginTransaction();

        List list = session.getNamedQuery("getAvailableThingy").list();

        transaction.commit();
        return list;

    } catch (Exception error) { 
        if (transaction != null) {
            transaction.rollback();
        }
        throw error;
    } finally {
        if (session != null) {
            session.close();
        }
    }

Это моеhibernate.cfg.xml конфигурационный файл






    
        org.postgresql.Driver
        org.hibernate.dialect.PostgreSQLDialect
        none
        after_transaction

        1
        2
        1
        1
        30
        5
        300
    

Обратите внимание, что причина очень короткого простоя соединения заключается в том, что это единственный способ, который я нашел, чтобы мои интеграционные тесты прошли. Они часто открывают и закрывают фабрику сессий, и поэтому у меня всегда кончаются связи. Поскольку мы находимся в начале проекта, я думаю, что этоне очень устойчивая стратегия в долгосрочной перспективе.

"интересно" Следует отметить, что, несмотря на тот факт, что я установил исходный пул соединений равным одному, c3p0 все равно пытается открыть два соединения при запуске. Я предполагаю, что где-то есть скрытый сеанс, который незакрыться (но где? побить меня).

Итак, как я могу заставить этот раздражающий пул соединений закрываться?

Дополнительная информация: как я создаю и уничтожаю свою фабрику сессий

import static com.google.common.base.Preconditions.*;

import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.inject.Provides;


@Singleton 
public class PostgisConnection implements Provider, AutoCloseable {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    private final ConnectionInfo connectionInfo;
    private SessionFactory sessionFactory = null;

    @Inject 
    public PostgisConnection(ConnectionInfo connectionInfo) {
        this.connectionInfo = connectionInfo;
    }

    public AutoCloseable open() {
        checkState(sessionFactory == null, "Connections to postgis are already open");

        logger.info("Creating sessionFactory for connection to postgis: {}", connectionInfo.getJdbcUrl());
        sessionFactory = newPostgisSessionFactory(connectionInfo);

        return this;
    }

    @Override
    public void close() throws Exception {
        try {
            if (sessionFactory != null) {
                logger.info("Closing sessionFactory for postgis: {}", connectionInfo.getJdbcUrl());
                sessionFactory.close();
                checkState(sessionFactory.isClosed(), "Session factory should be closed at this point");
            }
        } catch (Exception error) {
            logger.error("Error closing SessionFactory", error);
        }
    }

    @Provides 
    public SessionFactory get() {
        return sessionFactory;
    }

    public static SessionFactory newPostgisSessionFactory(ConnectionInfo connectionInfo) {
        Configuration configuration = configurationWith(connectionInfo);
        return configuration.buildSessionFactory(registryFrom(configuration));
    }

    private static Configuration configurationWith(ConnectionInfo connectionInfo) {
        Configuration configuration = new Configuration();
        setConnectionInfo(connectionInfo, configuration);
        configuration.addURL(PostgisConnection.class.getResource("mapping.hbm.xml"));
        configuration.configure(PostgisConnection.class.getResource("hibernate.cfg.xml"));

        return configuration;
    }

    private static void setConnectionInfo(ConnectionInfo connectionInfo, Configuration configuration) {
        configuration.setProperty("hibernate.connection.url", connectionInfo.getJdbcUrl());
        configuration.setProperty("hibernate.connection.username", connectionInfo.getUsername());
        configuration.setProperty("hibernate.connection.password", connectionInfo.getPassword());
    }

    private static ServiceRegistry registryFrom(Configuration configuration) {
        return new ServiceRegistryBuilder()
                .applySettings(configuration.getProperties())
                .buildServiceRegistry();
    }

}
Hibernate версия: 4.1.10.FinalВерсия C3p0: 0.9.1.2

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

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