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

JavaBean 中數據庫操作最佳實踐:連接管理、Statement 復用與批處理模式

     編輯:J2EE

B/S 架構下數據庫操作的核心挑戰

傳統 C/S 應用採用長連接模式:用戶啟動程序建立連接,退出時斷開。而 B/S 架構基於 HTTP 無狀態短連接:每次請求 Server 分配連接,響應結束即釋放,Server 無法識別連接歸屬。這種根本差異要求 JavaBean 設計時避免傳統連接管理模式。

JavaBean 數據庫操作三大原則

  1. 不在 Bean 內部直接創建連接(包括構造函數、普通方法)
  2. 不持有長期連接/Statement 引用作為實例變量
  3. 由調用者(應用程序)負責連接生命周期,通過參數傳遞或設置方法注入

反例:構造函數創建連接 → 一個應用引用多 Bean 或多應用共享 Bean 會產生大量無用連接,耗盡連接池。

查詢操作:靈活傳遞 Statement 參數

單層查詢

public ResultSet getRS(Statement stmt, String sqlTxt) {
    ResultSet rs = null;
    try {
        rs = stmt.executeQuery(sqlTxt);
    } catch (SQLException e) {
        // 處理異常或拋出
    }
    return rs;
}

嵌套查詢問題與解決

同一 Statement 執行新查詢會關閉前一個 ResultSet,導致嵌套循環失效:

// 錯誤示範:rs1 關閉了 rs
while (rs.next()) {
    ResultSet rs1 = stmt.executeQuery(sqlTxt1); // rs 失效!
}

方案一:增加 Statement 參數(每層一個),但參數數量不固定,擴展性差。

方案二(推薦):傳入 Connection,在方法內部按需創建多個 Statement:

public class QueryBean {
    private Connection conn = null;

    public QueryBean() {}
    public QueryBean(Connection conn) { this.conn = conn; }
    public void setConnection(Connection conn) { this.conn = conn; }

    public String getData(String sql1, String sql2) {
        String result = null;
        try (Statement stmt1 = conn.createStatement();
             Statement stmt2 = conn.createStatement()) {
            ResultSet rs1 = stmt1.executeQuery(sql1);
            while (rs1.next()) {
                ResultSet rs2 = stmt2.executeQuery(sql2);
                if (rs2.next()) {
                    result = rs1.getString(1) + ":" + rs2.getString(1);
                }
            }
        } catch (SQLException e) { /* 處理 */ }
        return result;
    }
}

應用程序通常一個 Connection 完成所有工作,無需重複注入。

增刪改操作:Statement 復用與批處理

DML 操作無 ResultSet 問題,單一 Statement 可完成所有工作。推薦使用單獨設置方法注入 Statement(避免與 Connection 衝突)。

批處理模式最佳實踐

public class UpdateBean {
    private Statement stmt = null;

    public void setStatement(Statement stmt) { this.stmt = stmt; }

    public void executeBatchUpdates() {
        try {
            stmt.addBatch("UPDATE table SET col=val WHERE ...");
            stmt.addBatch("INSERT INTO table (...) VALUES (...)");
            stmt.addBatch("DELETE FROM table WHERE ...");
            // 更多 DML...
            stmt.executeBatch(); // 一次性提交
        } catch (SQLException e) { /* 處理 */ }
    }
}

優勢:減少網絡往返,提高吞吐量;原子性提交或按需分批。

總結:JavaBean 數據庫操作設計清單

  • ✅ Bean 無參構造函數,不創建連接
  • ✅ 提供 setConnection(Connection) / setStatement(Statement) 注入方法
  • ✅ 查詢方法接受 Connection 參數,內部創建多 Statement 支持嵌套
  • ✅ DML 操作復用單一 Statement,採用批處理提交
  • ✅ 異常妥善處理(記錄、轉換、拋出),不吞沒
  • ✅ 資源關閉使用 try-with-resources 或 finally 塊
  • ✅ 連接池管理完全交由應用層/容器負責

遵循以上原則,JavaBean 將成為無狀態、可復用、線程安全的數據訪問組件,完美適配 B/S 架構的短連接特性。

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