首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Java 單例模式實現 MySQL 連接池工具類:DBUtils 最佳實踐

     編輯:MySQL 綜合教學

Java 單例模式實現 MySQL 連接池工具類:DBUtils 最佳實踐

資料庫連接管理是 Java 應用效能與穩定性的基石。本文展示基於單例模式的 DBUtils 類,封裝連接獲取、資源釋放、異常處理,適用於中小型專案快速落地。

完整原始碼

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBUtils {
    // 資料庫連接配置
    private static final String URL = "jdbc:mysql://localhost:3306/jdbc?characterEncoding=utf-8";
    private static final String USER_NAME = "root";
    private static final String PASSWORD = "123123";

    // 單例實例
    private static final DBUtils INSTANCE = new DBUtils();

    public static DBUtils getInstance() {
        return INSTANCE;
    }

    // 私有建構子,防止外部實例化
    private DBUtils() {}

    /**
     * 獲取資料庫連接
     * @return Connection 連接物件,失敗返回 null
     */
    public Connection getConn() {
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 統一資源釋放,按逆序關閉
     * @param conn 連接
     * @param pstmt 預編譯語句
     * @param rs 結果集
     */
    public void releaseRes(Connection conn, PreparedStatement pstmt, ResultSet rs) {
        try {
            if (rs != null) rs.close();
            if (pstmt != null) pstmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

設計亮點解析

  1. 單例模式:靜態最終實例 + 私有建構子,確保全域唯一入口,避免重複載入驅動
  2. 資源釋放順序:ResultSet → PreparedStatement → Connection,符合 JDBC 規範,防止連接洩漏
  3. 異常吞噬與日誌:捕獲異常並 printStackTrace,生產環境建議接入 SLF4J/Log4j
  4. UTF-8 編碼顯式指定:URL 參數 characterEncoding=utf-8 解決中文亂碼

使用範例

DBUtils utils = DBUtils.getInstance();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
    conn = utils.getConn();
    pstmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
    pstmt.setInt(1, 100);
    rs = pstmt.executeQuery();
    while (rs.next()) {
        // 處理結果
    }
} finally {
    utils.releaseRes(conn, pstmt, rs); // 確保釋放
}

進階優化方向

  • 引入 HikariCP / Druid 成熟連接池,支援連接複用、洩漏檢測、效能監控
  • 配置檔外部化(properties/yaml),支援多環境切換
  • 新增 getConn(long timeout) 支援獲取連接超時控制

此工具類適合快速原型、中小專案;高併發核心系統請直接上生產級連接池。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved