首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

使用 Java JDBC 測試 MySQL 最大連接數的完整示例代碼

     編輯:MySQL 資料庫相關知識

背景

早期 Oracle 8i 因連接數耗盡頻發 ORA-12500,編寫 Java 程序測試最大連接數。現轉用 MySQL,同理編寫測試工具驗證 max_connections 設置是否生效。

完整 Java 代碼

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_connections
  • 若遠超配置值,檢查 my.cnf 是否生效、是否被 open_files_limit 限制
  • Linux 還需關注 ulimit -n 文件描述符限制

生產環境建議

  1. 監控 Threads_connected / Max_used_connections 狀態變量
  2. 設置合理的 wait_timeout、interactive_timeout 釋放閒置連接
  3. 應用層使用連接池(HikariCP、Druid),避免頻繁創建銷毀
  4. 配置 max_user_connections 防止單用戶佔滿

現代替代方案

使用 mysqlslap 官方壓測工具或 sysbench 進行更專業的並發連接壓測:

mysqlslap --concurrency=200 --iterations=5 --create-schema=test --query="SELECT 1"
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved