早期 Oracle 8i 因連接數耗盡頻發 ORA-12500,編寫 Java 程序測試最大連接數。現轉用 MySQL,同理編寫測試工具驗證 max_connections 設置是否生效。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.io.IOException;
public class TestMaxConnections {
public static void main(String[] args) {
int count = 0;
final int MAX_TEST = 1000;
Connection[] conns = new Connection[MAX_TEST];
Statement[] stmts = new Statement[MAX_TEST];
ResultSet[] rss = new ResultSet[MAX_TEST];
try {
// 1. 載入驅動 (MySQL 5.1+ 使用 com.mysql.jdbc.Driver)
Class.forName("com.mysql.jdbc.Driver").newInstance();
// 2. 循環建立連接直到異常
for (count = 0; count < 300; count++) {
conns[count] = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/mysql", "root", "");
stmts[count] = conns[count].createStatement();
rss[count] = stmts[count].executeQuery("SELECT * FROM user");
while (rss[count].next()) {
// 可選:消費結果集防止游標佔用
}
System.out.print(count + "\t");
}
} catch (SQLException ex) {
System.out.println("\n[SQL異常] " + ex.getMessage());
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException ex) {
System.out.println("\n[驅動異常] " + ex.getMessage());
} finally {
// 3. 釋放所有資源
try {
System.out.println("\n系統已打開 " + count + " 個 MySQL 連接。按 Enter 鍵關閉...");
System.in.read();
System.out.println("正在關閉連接...");
for (int i = count - 1; i >= 0; i--) {
if (rss[i] != null) rss[i].close();
if (stmts[i] != null) stmts[i].close();
if (conns[i] != null) conns[i].close();
System.out.print(i + "\t");
}
} catch (SQLException | IOException ex) {
System.out.println("\n關閉異常: " + ex.getMessage());
}
}
}
}
# 確保 classpath 包含 mysql-connector-java.jar
javac -cp .:mysql-connector-java-5.1.49.jar TestMaxConnections.java
java -cp .:mysql-connector-java-5.1.49.jar TestMaxConnections
| 參數 | 說明 |
|---|---|
MAX_TEST | 最大嘗試連接數,設大於預期 max_connections |
| 循環上限 300 | 可調大,觀察異常拋出位置即為實際限制 |
查詢 SELECT * FROM user | 輕量級查詢驗證連接可用性,mysql.user 表較小 |
| 資源釋放順序 | ResultSet → Statement → Connection,逆序關閉 |
SQLException: Too many connections 時的 count 值 = 當前生效的 max_connectionsmy.cnf 是否生效、是否被 open_files_limit 限制ulimit -n 文件描述符限制Threads_connected / Max_used_connections 狀態變量wait_timeout、interactive_timeout 釋放閒置連接max_user_connections 防止單用戶佔滿使用 mysqlslap 官方壓測工具或 sysbench 進行更專業的並發連接壓測:
mysqlslap --concurrency=200 --iterations=5 --create-schema=test --query="SELECT 1"