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

Java 通用資料庫連線工具類實作(支援多種資料庫)

     編輯:Java 相關知識

前言

本文提供一個通用的 Java 資料庫連線工具類 DBUtil,支援 MySQL、Oracle、SQL Server 等主流資料庫。核心基於 Apache Commons DBCP 連線池與 DbUtils 查詢輔助,內建連線保活機制,適合作為專案基礎設施元件。

核心特性

  • 多資料庫支援:僅需更換驅動類名與連線字串
  • 連線池管理:基於 DBCP GenericObjectPool 實作
  • SQL 統一入口:提供 execute/query 多載方法
  • 結果自動映射:ResultSet → List<Map<String, Object>>
  • 定時保活:背景執行緒每 2 分鐘執行 select 1 防止連線斷開

依賴環境

commons-dbcp-1.4.jar
commons-dbutils-1.3.jar
commons-pool-1.5.4.jar

下載連結:依賴包下載

關鍵程式碼結構

建構子與配置

public DBUtil(String dri, String url, String userName, String password, String poolName) {
    this.dri = dri;
    this.url = url;
    this.username = userName;
    this.password = password;
    this.poolName = poolName;
}

常見資料庫配置範例:

資料庫驅動類名連線 URL 範例
MySQLcom.mysql.jdbc.Driverjdbc:mysql://host:3306/db?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
Oracleoracle.jdbc.driver.OracleDriverjdbc:oracle:thin:@host:1521:sid
SQL Servercom.microsoft.sqlserver.jdbc.SQLServerDriverjdbc:sqlserver://host:1433;DatabaseName=db

連線池啟動

private void StartPool() {
    Class.forName(dri);
    if (connectionPool != null) ShutdownPool();
    
    connectionPool = new GenericObjectPool(null);
    ConnectionFactory cf = new DriverManagerConnectionFactory(url, username, password);
    PoolableConnectionFactory pcf = new PoolableConnectionFactory(
        cf, connectionPool, null, "SELECT 1", false, true);
    
    Class.forName("org.apache.commons.dbcp.PoolingDriver");
    PoolingDriver driver = (PoolingDriver) DriverManager
        .getDriver("jdbc:apache:commons:dbcp:");
    driver.registerPool(poolName, pcf.getPool());
    
    queryThread = new QueryThread(this);
    queryThread.start();
}

SQL 執行與查詢

// 更新操作
public int execute(String sql, Object[] params) throws Exception {
    Connection conn = getConnection();
    try {
        return new QueryRunner().update(conn, sql, params);
    } finally { Close(conn); }
}

// 查詢操作
public List<Map<String, Object>> query(String sql) throws SQLException {
    Connection conn = getConnection();
    try {
        return new QueryRunner().query(conn, sql, new MapListHandler());
    } finally { Close(conn); }
}

定時保活執行緒

class QueryThread extends Thread {
    private DBUtil dbUtil;
    private boolean startQuery = true;
    
    public void run() {
        while (true) {
            try {
                if (startQuery) dbUtil.query("select 1");
            } catch (Exception e) { e.printStackTrace(); }
            finally {
                try { Thread.sleep(120000); }
                catch (InterruptedException e) { e.printStackTrace(); }
            }
        }
    }
    public void setStartQuery(boolean flag) { this.startQuery = flag; }
}

使用示範

// MySQL 範例
DBUtil mysql = new DBUtil(
    "com.mysql.jdbc.Driver",
    "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8",
    "root", "123456", "mysql_pool"
);

// Oracle 範例
DBUtil oracle = new DBUtil(
    "oracle.jdbc.driver.OracleDriver",
    "jdbc:oracle:thin:@192.168.1.100:1521:ORCL",
    "scott", "tiger", "oracle_pool"
);

// 通用操作
List<Map<String, Object>> users = mysql.query("SELECT * FROM users WHERE status = ?", 1);
int affected = oracle.execute("UPDATE accounts SET balance = balance - ? WHERE id = ?", new Object[]{100, 1});

生產環境建議

  • 升級連線池:建議替換為 HikariCP(效能更優、維護中)
  • 參數化配置:將連線資訊外部化至 properties/YAML
  • 監控指標:整合 Micrometer/Actuator 監控連線池狀態
  • 例外處理:統一拋出自訂異常,避免吞噬錯誤

總結

此工具類展示了傳統 Java 專案中資料庫存取層的完整封裝,從連線池建立、SQL 執行到連線保活,提供了可直接落地的參考實作。雖然依賴庫版本較舊,但其架構設計思路對理解連線池原理與防止連線超時策略仍具教學價值。

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