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