【问题标题】:Hibernate+PostgreSQL "Too Many Connections" errorHibernate+PostgreSQL“连接太多”错误
【发布时间】:2015-03-08 11:45:01
【问题描述】:

我有一个应用程序,它在多个并发会话(超过 1000 个)中使用数据库。 在 Postgres 中,可用的最大连接数默认设置为 100,我没有更改。

Hibernate 的最大连接池大小为 20,但应用似乎忽略了这一点并抛出“连接太多”错误。

所以问题是当唯一可用的会话数是 100 时,如何处理超过 1000 个会话? 有没有这样的排队或smth是可能的?

【问题讨论】:

    标签: java hibernate postgresql connection pool


    【解决方案1】:

    Hibernate 的最大连接池大小为 20,但应用似乎忽略了这一点并抛出“连接太多”错误。

    仔细检查您对 Hibernate Session Factory 的使用:

    • 如果您是 Web 应用,请阅读此内容 [1]
    • 如果您是独立应用,请阅读此内容 [2]

    问题通常是 Hibernate Session 使用不当。

    [1]https://developer.jboss.org/wiki/UsingHibernatewithTomcat [2]http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html/ch01.html#tutorial-firstapp-workingpersistence

    所以问题是如何处理超过 1000 个会话 可用是100?有没有这样的排队或smth是可能的?

    100 是您可以打开的并发连接,在这些连接上您可以执行 100 多个操作:Hibernate 只是为您管理队列。

    【讨论】:

    • 我接受了 [2] 案例,并将 .openSession() 更改为 .getCurrentSession();.. 等等,正如它所描述的那样。但是没有效果。在应用程序中,每个会话同时从不同的线程创建(1000 个线程=1000 个会话),.getCurrentSession() 无论如何都会创建一个新的会话,就像.openSession() 一样。在这种情况下,ofc 1000sessions 将超过 db 连接限制并抛出错误。这就是为什么我要排队。但是 Hibernate 似乎不想为我管理这个:(
    • 我尝试打开一次会话并将线程池嵌套到此,但由于Hibernate doesn't support nested transactions 错误,这似乎是个坏主意
    • 是的,我在那里使用它。但是现在我已经通过使用 c3p0 连接池并将最大池大小设置为 100 修复了一个错误。现在可以正常工作:)) 感谢您的帮助
    猜你喜欢
    • 2012-08-25
    • 2012-03-02
    • 2013-06-04
    • 1970-01-01
    • 2010-11-15
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多