【问题标题】:Exception too many connections with Hibernate异常与 Hibernate 的连接过多
【发布时间】:2026-01-09 19:10:01
【问题描述】:

当我尝试连接 Hibernate 时出现错误。 代码创建 1000 个线程,每个线程打开一个连接。无论如何,代码很短,它们很快就关闭了连接。

我打印一个带有连接总数的计数器(打开一个时增加,关闭一个时减少..)。 当我得到大约 155 个连接时,我得到了那个错误。我试图将池连接(默认值为 150)增加到 500,但是在 180 个连接时我得到了同样的错误。

我做了另一个小测试,在我启动每个线程后我做了一个 Thread.sleep(10) 并且它工作,我不知道这就是为什么如果我说我的池大小为 500,它不工作。

for (int i=0; i<1000; i++) {
            Thread.sleep(10); //it works with this modification because it gets time to finish some threads..
            newThread = new WThread(params);
            newThread.start();
        }

池配置:

<property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.connection.autocommit">false</prop>
                <prop key="hibernate.show_sql">false</prop>

                <prop key="hibernate.hbm2ddl.auto">validate</prop>

                <prop key="hibernate.c3p0.min_size">2</prop>
                <prop key="hibernate.c3p0.max_size">125</prop> --> increment this parameter it's not working.
                <prop key="hibernate.c3p0.timeout">1800</prop>
                <prop key="hibernate.c3p0.max_statements">500</prop>
            </props>

我不知道它可能是什么,,,我的电脑内存?我不知道。

我得到的错误:

14/07/30 09:57:59 WARN spi.SqlExceptionHelper: SQL Error: 1040, SQLState: 08004
14/07/30 09:57:59 ERROR spi.SqlExceptionHelper: Data source rejected establishment of connection,  message from server: "Too many connections"

...

14/07/30 09:57:59 INFO internal.DefaultLoadEventListener: HHH000327: Error performing load command : org.hibernate.exception.JDBCConnectionException: Could not open connection
14/07/30 09:57:59 WARN spi.SqlExceptionHelper: SQL Error: 1040, SQLState: 08004

【问题讨论】:

  • 你遇到了什么错误?
  • 我编辑时出现错误。

标签: mysql multithreading hibernate connection-pooling


【解决方案1】:

你的错误信息说:

数据源拒绝建立连接,来自服务器的消息:“连接太多”

如果该消息并非完全具有误导性(您可以通过在 SqlExceptionHelper 中设置断点轻松验证这一点,并检查包含初始异常对象的局部变量,该对象包含应确定异常确切来源的堆栈跟踪),它告诉你数据库服务器对并发连接的数量也有限制……

【讨论】:

    【解决方案2】:

    hibernate.c3p0.max_size 的增加没有帮助,因为 MySQL 数据库没有提供更多的连接。如documented,max_connections 的默认值为 151:

    允许的连接数由 max_connections 系统变量。默认值为 151 以提高 MySQL 与 Apache Web 服务器一起使用时的性能。

    设置此变量立即生效,无需重启:

        set global max_connections = 500;
    

    要在重启后也保留此设置,应在 my.cnf 中添加以下内容:

        max_connections = 500
    

    【讨论】:

      最近更新 更多