java - 数据源拒绝建立连接,来自服务器 : "Too many connections" 的消息

标签 java mysql spring hibernate jakarta-ee

我正在使用 hibenate 和 spring,当我们从 250 位用户的 jmeter 中命中时,我遇到了以下异常

"Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"

hibernate_cfg.xml

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/my_db</property>
    <property name="hibernate.connection.username">user1</property>
    <property name="hibernate.connection.pool_size">1</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">50</property>
    <property name="hibernate.c3p0.timeout">300</property>
    <property name="hibernate.c3p0.max_statements">500</property>
    <property name="hibernate.c3p0.idle_test_period">3000</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.hbm2ddl.auto">update</property>`

Spring

<bean id="dataSource" scope="prototype" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName">
        <value>${dbDriver}</value>
    </property>  
    <property name="url">
        <value>${dbURL}</value> 
    </property>
    <property name="username">
        <value>${dbUsername}</value>
    </property>
    <property name="password">
        <value>${dbPassword}</value>
    </property>
</bean>

最佳答案

这是来自服务器的消息,因此,我将检查服务器报告的已连接客户端的数量。如果这是一个预期的数字,比如 500 左右,那么我会增加服务器上的这个限制,如果你真的希望你的应用程序的并发级别。否则,减少客户端数量。

关于其工作原理的一些背景知识:每个客户端都是服务器上的一个线程,每个线程将至少消耗一个连接。如果你做对了,一旦线程完成(即:一旦响应被发送到客户端),连接将返回到池中。因此,在最好的情况下,如果您有大约 500 个用户连接,您将有 500 个连接。如果看到一个数字接近并发用户数的倍数(即:2 个用户,4 个连接),那么您可能每个线程消耗了一个以上的连接(这是您为不使用由提供的数据源而付出的代价)您的应用程序服务器,如果您正在使用的话)。如果你看到一个非常高的数字(比如,用户数量的 10 倍),那么你可能在某处发生了连接泄漏。如果您忘记关闭连接,可能会发生这种情况。

我真的建议使用由您的应用程序服务器管理的 EntityManager,并使用它也提供的 DataSource。然后,您不必担心管理连接池。

关于java - 数据源拒绝建立连接,来自服务器 : "Too many connections" 的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12088292/

相关文章:

java - spring-oauth2 登录成功处理器

java - 使用 Spring Data JPA @LastModifiedDate 从审计中排除某些字段

java - 写入 ClassPath 上的数据文件不会反射(reflect)在项目中?

java - 泛型类中的广泛类型删除

java - 如何格式化 Velocity 模板中的数字?

php,mysql - 从下拉列表和数据库中删除项目

php - 将参数从 PHP 页面传递到 MySQL View

java - next() 与 Single() 哪个有效?

Java,确定 HashMap 中是否有任何值与值匹配的最快方法?

mysql - 如何在 CodeIgniter 中为所有 SELECT 设置用户的时区