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

Java 資料庫程式設計核心技巧:可捲動結果集、批次更新、交易控制

     編輯:關於SqlServer

JDBC 核心流程:取得連線 → 建立 Statement → 執行 SQL → 處理結果 → 關閉資源。本文聚焦三大進階技巧,提升效能與資料一致性。

1. 可捲動、可更新結果集

// 僅捲動、唯讀
Statement stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,   // 不反映他人變更
    ResultSet.CONCUR_READ_ONLY);

// 可捲動、可更新
Statement stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_SENSITIVE,     // 即時反映他人變更
    ResultSet.CONCUR_UPDATABLE);

// PreparedStatement 同理
PreparedStatement ps = conn.prepareStatement(sql,
    ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

// 定位第 9000 列
rs.absolute(9000);
  • TYPE_SCROLL_INSENSITIVE:快照模式,效能較好。
  • TYPE_SCROLL_SENSITIVE:動態模式,支援 rs.updateRow()、insertRow()、deleteRow() 直接操作資料庫。

2. 批次更新

Statement 批次(多條不同 SQL)

Statement stmt = conn.createStatement();
stmt.addBatch("INSERT INTO t VALUES (1,'a')");
stmt.addBatch("UPDATE t SET c='b' WHERE id=2");
stmt.addBatch("DELETE FROM t WHERE id=3");
int[] counts = stmt.executeBatch(); // 每條影響列數

PreparedStatement 批次(同一 SQL 多組參數)

PreparedStatement ps = conn.prepareStatement("INSERT INTO t (id,name) VALUES (?,?)");
for (int i=1; i<=1000; i++) {
    ps.setInt(1, i);
    ps.setString(2, "name"+i);
    ps.addBatch();
}
int[] counts = ps.executeBatch(); // 單次網路往返完成 1000 筆插入
  • 大幅減少網路往返與解析開銷,批量匯入效能提升 10~100 倍。
  • 建議搭配 conn.setAutoCommit(false) 手動提交,再 conn.commit(),避免單條自動提交產生大量交易記錄。

3. 交易處理

conn.setAutoCommit(false); // 關閉自動提交
try {
    Statement stmt = null;
    // 業務邏輯 1
    stmt = conn.createStatement();
    stmt.executeUpdate("INSERT INTO users ...");
    stmt.close();

    // 業務邏輯 2
    stmt = conn.createStatement();
    stmt.executeUpdate("INSERT INTO corps ...");
    stmt.close();

    conn.commit(); // 全部成功才提交
} catch (SQLException e) {
    conn.rollback(); // 任一失敗全盤回滾
    throw e;
} finally {
    conn.setAutoCommit(true); // 恢復預設
}
  • 關鍵:每條 SQL 執行前,上一條的 Statement 必須 close,否則游標/鎖未釋放導致死鎖或異常。
  • 交易邊界盡量縮小,避免長交易阻塞並發。

資源關閉順序(反向)

if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();

建議使用 try-with-resources (Java 7+) 自動管理。

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