首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

使用 Java 程式測試 MySQL 最大連接數的實作指南

     編輯:Java 程式設計入門

背景動機

早期專案使用 Oracle 8i 時常遇 ORA-12500 等連接數耗盡錯誤,團隊編寫 JDBC 壓測工具驗證資料庫連接上限。現轉用 MySQL,同樣需要一個輕量級程式快速測試 max_connections 設定是否生效。本文提供可直接編譯執行的完整範例。

核心程式碼

import java.sql.*;
import java.io.IOException;

public class TestMySQLMaxConnections {
    public static void main(String[] args) {
        final int MAX_ATTEMPTS = 1000;          // 陣列上限,防 OOM
        Connection[] conns = new Connection[MAX_ATTEMPTS];
        Statement[] stmts = new Statement[MAX_ATTEMPTS];
        ResultSet[] rss = new ResultSet[MAX_ATTEMPTS];

        int successCount = 0;

        try {
            // 1. 載入驅動 (MySQL 5.1+ 可省略 Class.forName,保留相容舊版)
            Class.forName("com.mysql.cj.jdbc.Driver").newInstance();

            // 2. 迴圈建立連接,直到拋出 SQLException
            for (int i = 0; i < MAX_ATTEMPTS; i++) {
                conns[i] = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/mysql?useSSL=false&serverTimezone=UTC",
                    "root", "your_password"
                );
                stmts[i] = conns[i].createStatement();
                rss[i] = stmts[i].executeQuery("SELECT 1"); // 輕量查詢驗證連接可用
                rss[i].next();
                System.out.print(i + " ");
                successCount++;
            }
        } catch (SQLException e) {
            System.out.println("\n連接失敗:" + e.getMessage()
                + " (錯誤碼:" + e.getErrorCode() + ", SQLState: " + e.getSQLState() + ")");
        } catch (Exception e) {
            System.out.println("\n其他異常:" + e);
        } finally {
            // 3. 釋放資源並等待用戶確認
            System.out.println("\n成功建立 " + successCount + " 個連接。按 Enter 關閉...");
            try { System.in.read(); } catch (IOException ignored) {}

            for (int i = successCount - 1; i >= 0; i--) {
                closeQuietly(rss[i]);
                closeQuietly(stmts[i]);
                closeQuietly(conns[i]);
                System.out.print(i + " ");
            }
            System.out.println("\n所有連接已關閉。");
        }
    }

    private static void closeQuietly(AutoCloseable resource) {
        if (resource != null) {
            try { resource.close(); } catch (Exception ignored) {}
        }
    }
}

關鍵點解析

  1. 驅動類別名:MySQL 8.0+ 使用 com.mysql.cj.jdbc.Driver;5.1 版用 com.mysql.jdbc.Driver。建議依賴管理工具 (Maven/Gradle) 引入對應版本 mysql-connector-j。
  2. 連接 URL 參數:useSSL=false 避免本地測試 SSL 握手失敗;serverTimezone=UTC 解決時區警告。
  3. 輕量驗證查詢:SELECT 1 比 SELECT * FROM user 更快、無權限依賴。
  4. 資源釋放模式:finally 區塊配合 closeQuietly 確保不因單一關閉失敗導致後續資源洩漏。
  5. 陣列上限:設定 MAX_ATTEMPTS 防止 JVM Heap 耗盡先於資料庫拒絕連接。

對應 MySQL 伺服器端設定

  • 查看當前上限:SHOW VARIABLES LIKE 'max_connections';
  • 臨時調整:SET GLOBAL max_connections = 500; (需 SUPER 權限,重啟失效)
  • 永久生效:修改 my.cnf / my.ini 的 [mysqld] 區段 max_connections=500 並重啟服務。

常見錯誤碼對照

進階建議

  • 生產環境請改用連接池 (HikariCP、Druid) 壓測,模擬真實借還連接行為。
  • 結合 SHOW PROCESSLIST 觀察連接狀態 (Sleep/Query/Locked)。
  • 監控 Threads_connected、Connection_errors_max_connections 狀態變數。

結語

這支程式雖簡單,卻能快速驗證 MySQL 連接上限與網路/權限設定是否正確。實務上建議納入自動化部署腳本,於資料庫遷移或參數調整後自動跑一次,作為冒煙測試的一環。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤碼SQLState含義
104008004Too many connections (達 max_connections)
104208S01Unable to connect to host (網路/主機/埠不可達)
104528000Access denied (帳密錯誤)