如何在 Hibernate 中禁用连接池

Mat*_*ari 5 java database firebird hibernate connection-pooling

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

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

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

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

Vla*_*cea 3

最灵活的解决方案是使用显式 DataSource,而不是通过 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;
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以选择池化或非池化DataSource

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

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

  • 但这也会利用连接池...这就是问题(我认为),我需要一些东西,使每个会话 open() 和 close() 调用实际创建一个连接并关闭它,而不会闲置打开连接在游泳池 (2认同)