如何在Hibernate中禁用连接池



我有一个web应用程序,目前使用c3p0和Hibernate连接到Firebird 1.5数据库。

我经常遇到数据库停止响应的问题,即使尝试手动重新启动服务也没有任何效果,并且它不生成任何日志,所以我必须手动重新启动机器以使其再次工作。

我认为当池试图获取特定数量的连接或类似的东西时,Firebird可能会挂起。所以,我需要测试我的应用程序没有连接池,检查是否这是或不是问题。

我不能简单地从持久化中删除c3p0配置,因为这样Hibernate将使用它自己的集成连接池。那么该怎么做呢?

最灵活的解决方案是使用显式数据源,而不是通过Hibernate配置连接池。配置非池化DataSource的一个选项是使用DriverManagerDataSource:

@Override
protected Properties getProperties() {
    Properties properties = new Properties();
    properties.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
    //log settings
    properties.put("hibernate.hbm2ddl.auto", "update");
    //data source settings
    properties.put("hibernate.connection.datasource", newDataSource());
    return properties;
}
protected ProxyDataSource newDataSource() {
    DriverManagerDataSource actualDataSource = new DriverManagerDataSource();
    actualDataSource.setUrl("jdbc:hsqldb:mem:test");
    actualDataSource.setUsername("sa");
    actualDataSource.setPassword("");
    ProxyDataSource proxyDataSource = new ProxyDataSource();
    proxyDataSource.setDataSource(actualDataSource);
    proxyDataSource.setListener(new SLF4JQueryLoggingListener());
    return proxyDataSource;
}

这样您就可以选择一个池化或非池化的DataSource

为了更好地了解您的连接池资源使用情况,您可以配置FlexyPool来收集以下指标:

    并发连接
  • 并发连接请求
  • 数据源连接获取时间
  • 连接租用时间
  • 最大池大小
  • 总连接获取时间
  • 溢出池大小
  • 重试尝试

我找到hibernate 3.3和4.3的文档说:

请替换hibernate.connection。Pool_size属性连接池特定的设置。这将关闭Hibernate的内部池。

Hibernate将使用它的org.hibernate.connection.C3P0ConnectionProvider如果您设置hibernate.c3p0。*属性

所以删除hibernate.connection。Pool_size and any hibernate.c3p0…

如果配置属性,则禁用连接池。

加上Vlad的回答:

如果有人仍然面对这个:

  • 请务必删除hibernate-c3p0"如果存在的话,从您的类路径,因为这将自动启用MChange c3p0连接池。

  • 另一个选项,您可以在关闭实体管理器时手动关闭连接:

              ....
              SessionImpl ses = (SessionImpl) session;
              close(ses.connection());
              try {
                  session.close();
              } catch (Exception e) {
                  logger.error(e);
              }
              ........
    
好运

相关内容

  • 没有找到相关文章

最新更新