傳統 C/S 應用採用長連接模式:用戶啟動程序建立連接,退出時斷開。而 B/S 架構基於 HTTP 無狀態短連接:每次請求 Server 分配連接,響應結束即釋放,Server 無法識別連接歸屬。這種根本差異要求 JavaBean 設計時避免傳統連接管理模式。
反例:構造函數創建連接 → 一個應用引用多 Bean 或多應用共享 Bean 會產生大量無用連接,耗盡連接池。
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 完成所有工作,無需重複注入。
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) { /* 處理 */ }
}
}
優勢:減少網絡往返,提高吞吐量;原子性提交或按需分批。
setConnection(Connection) / setStatement(Statement) 注入方法Connection 參數,內部創建多 Statement 支持嵌套遵循以上原則,JavaBean 將成為無狀態、可復用、線程安全的數據訪問組件,完美適配 B/S 架構的短連接特性。