首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Hibernate中禁用连接池

如何在Hibernate中禁用连接池
EN

Stack Overflow用户
提问于 2015-05-25 14:20:42
回答 3查看 5.4K关注 0票数 4

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

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2015-05-26 05:49:27

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

代码语言:javascript
复制
@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以收集以下指标:

  • 并发连接
  • 并发连接请求
  • 数据源连接获取时间
  • 连接租赁时间
  • 最大池大小
  • 总连接获取时间
  • 溢流池大小
  • 重试
票数 2
EN

Stack Overflow用户

发布于 2015-10-14 08:21:34

我找到了hibernate 3.34.3的文档,上面写着:

只需将hibernate.connection.pool_size属性替换为特定于连接池的设置。这将关闭Hibernate的内部池。 如果设置hibernate.c3p0.*属性,Hibernate将使用其org.hibernate.connection.C3P0ConnectionProvider作为连接池。

所以删除hibernate.connection.pool_size和任何hibernate.c3p0..。属性来自配置,而不是禁用连接池。

票数 0
EN

Stack Overflow用户

发布于 2022-08-04 11:53:25

补充弗拉德的回答:

如果有人还面临着这样的问题:

  • 如果存在,请确保从类路径中删除"hibernate-c3p0“,因为这将自动启用MChange c3p0连接池。
  • 另一个选项是,您可以在关闭实体管理器时手动关闭连接: ……SessionImpl ses = (SessionImpl)会话;关闭(ses.connection());尝试{ session.close();} catch (异常e) { logger.error(e);}.

注意事项:上面的手动关闭将适用于默认的hibernate池,而不是hibernate默认池。

祝好运

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30440477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档