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

JDBC 工具類全集:從基礎連接到連接池與事務管理

     編輯:Java 綜合教學

JDBC 工具類全集:從基礎連接到連接池與事務管理

資料庫操作是 Java 後端核心,本文梳理三種層次的 JdbcUtils 實現:基礎連接、簡易連接池、完整事務管理,代碼可直接落地專案。

一、 版本 1:讀取 Properties 的基礎連接工具

public class JdbcUtils {
    private static final String CONFIG = "dbconfig.properties";
    private static Properties prop = new Properties();

    static {
        try (InputStream in = Thread.currentThread()
                .getContextClassLoader().getResourceAsStream(CONFIG)) {
            prop.load(in);
            Class.forName(prop.getProperty("driverClassName"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static Connection getConnection() {
        try {
            return DriverManager.getConnection(
                prop.getProperty("url"),
                prop.getProperty("username"),
                prop.getProperty("password")
            );
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}

適用場景: 單體小應用、測試環境、無高併發需求。

二、 版本 2:整合 C3P0 連接池(需 c3p0-config.xml)

配置片段:

<c3p0-config>
  <default-config>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="user">root</property>
    <property name="password">123</property>
    <property name="initialPoolSize">10</property>
    <property name="maxPoolSize">20</property>
  </default-config>
</c3p0-config>

工具類:

public class JdbcUtils2 {
    private static ComboPooledDataSource ds = new ComboPooledDataSource(); // 讀取默認配置

    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
    public static DataSource getDataSource() { return ds; }
}

優勢: 連接復用、池參數可配、支援多命名配置(如 Oracle 專用)。

三、 版本 3:企業級 —— 連接池 + ThreadLocal 事務管理

核心難點:同一事務必須共用同一 Connection,且不能與普通查詢混淆。採用 ThreadLocal<Connection> 綁定當前線程事務連接。

public class JdbcUtils3 {
    private static DataSource ds = new ComboPooledDataSource();
    private static ThreadLocal<Connection> tl = new ThreadLocal<>();

    // 獲取連接:有事務則返事務連接,否則從池取新連接
    public static Connection getConnection() throws SQLException {
        Connection conn = tl.get();
        return (conn != null) ? conn : ds.getConnection();
    }

    // 開啟事務
    public static void beginTransaction() throws SQLException {
        if (tl.get() != null) throw new SQLException("事務已開啟");
        Connection conn = ds.getConnection();
        conn.setAutoCommit(false);
        tl.set(conn);
    }

    // 提交事務
    public static void commitTransaction() throws SQLException {
        Connection conn = tl.get();
        if (conn == null) throw new SQLException("無事務可提交");
        conn.commit();
        conn.close();
        tl.remove();
    }

    // 回滾事務
    public static void rollbackTransaction() throws SQLException {
        Connection conn = tl.get();
        if (conn == null) throw new SQLException("無事務可回滾");
        conn.rollback();
        conn.close();
        tl.remove();
    }

    // 釋放連接:區分事務連接與普通連接
    public static void releaseConnection(Connection conn) throws SQLException {
        Connection txConn = tl.get();
        if (txConn == null) {               // 無事務 → 直接關閉
            conn.close();
        } else if (txConn != conn) {        // 有事務但非事務連接 → 關閉
            conn.close();
        } // 否則為事務連接,暫不關閉,待 commit/rollback 統一處理
    }
}

四、 關鍵設計點總結

版本核心組件事務支援適用場景
v1DriverManager + Properties無簡單工具/測試
v2C3P0 ComboPooledDataSource無(需手動管理 Connection)一般 Web 應用
v3C3P0 + ThreadLocal完整(begin/commit/rollback)企業級業務系統
  • ThreadLocal 隔離線程: 保證事務連接不串線,避免多線程環境下連接混亂。
  • 釋放邏輯雙重判斷: 精準識別「普通查詢連接」與「事務綁定連接」,防止過早關閉或洩漏。
  • 異常轉 RuntimeException: 簡化上層調用,統一由全局異常處理器捕獲。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved