Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:
Data source rejected establishment of connection, message from server: "Too many connections"
明確指出:**MySQL 伺服器拒絕新連線,因達到 max_connections 限制**。
Spring XML 配置 HikariCP 範例:
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&useSSL=false" />
<property name="username" value="root" />
<property name="password" value="password" />
<!-- 核心池大小:CPU 核心數 * 2 + 1 (建議 20-50) -->
<property name="maximumPoolSize" value="30" />
<!-- 最小閒置連線 -->
<property name="minimumIdle" value="10" />
<!-- 連線超時 (毫秒) -->
<property name="connectionTimeout" value="30000" />
<!-- 空閒超時 -->
<property name="idleTimeout" value="600000" />
<!-- 最大生命週期 -->
<property name="maxLifetime" value="1800000" />
<!-- 連線測試查詢 -->
<property name="connectionTestQuery" value="SELECT 1" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 其他屬性 -->
</bean>
-- 臨時生效 (重啟失效)
SET GLOBAL max_connections = 500;
-- 永久生效 (my.cnf / my.ini)
[mysqld]
max_connections = 500
open_files_limit = 65535 -- 配合調大
注意:盲目調大 `max_connections` 而無連線池,會導致記憶體耗盡 (每連線約 2-10MB)。**連線池是治本,調參數是治標**。
<property name="hibernate.connection.release_mode">after_transaction</property>
確保 `@Transactional` 正確配置,交易邊界清晰,Session 隨交易關閉歸還連線池。
**「Too many connections」核心對策:上連線池 (HikariCP) + 合理設定池大小 + 修正交易管理 + 優化 SQL**。單靠調大 MySQL `max_connections` 是自欺欺人,終將導致 OOM。建立完善的連線池監控與壓測機制,才能保證生產環境穩定。