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

Java JDBC Statement.createStatement 方法參數詳解:ResultSet 類型與並發性

     編輯:Java 相關知識

JDBC `Connection.createStatement()` 重載方法允許指定 `ResultSet` 的**類型**與**並發性**,決定游標可滾動性、敏感性及可更新性。本文系統講解三種類型、兩種並發性的組合差異、適用場景與代碼示例。

一、方法簽名

Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException;

二、ResultSet 類型(resultSetType)

常量值游標特性對外部修改可見性典型用途
TYPE_FORWARD_ONLY1003僅能向前移動(`next()`),不可回滾不可見(快照)預設、大數據流式讀取、高性能
TYPE_SCROLL_INSENSITIVE1004可向前/向後、絕對/相對定位(`first()`、`last()`、`absolute(n)`、`relative(n)`)不可見(開啟時快照)分頁查詢、需隨機訪問行
TYPE_SCROLL_SENSITIVE1005可滾動定位**可見**(實時反映他人提交的增刪改)協作環境、實時監控

三、ResultSet 並發性(resultSetConcurrency)

常量值含義支援操作
CONCUR_READ_ONLY1007只讀(預設)僅 `getXxx()`
CONCUR_UPDATABLE1008可更新`updateXxx()`、`insertRow()`、`deleteRow()`、`refreshRow()`

四、組合矩陣與資料庫支援度

類型 \ 並發性READ_ONLYUPDATABLE
FORWARD_ONLY✅ 普遍支援⚠️ 部份資料庫支援(MySQL 支援)
SCROLL_INSENSITIVE✅ 普遍支援⚠️ 需主鍵、資料庫支援
SCROLL_SENSITIVE⚠️ 部分支援❌ 極少支援

MySQL (Connector/J) 實測:
- `TYPE_FORWARD_ONLY` + `CONCUR_UPDATABLE` ✅
- `TYPE_SCROLL_INSENSITIVE` + `CONCUR_UPDATABLE` ✅ (需主鍵)
- `TYPE_SCROLL_SENSITIVE` 任何並發性 ❌ 退化為 INSENSITIVE

五、代碼示例

1. 可滾動只讀(分頁)

Statement stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY
);
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
rs.last();              // 移至最後一行
int total = rs.getRow(); // 獲取總行數
rs.absolute((page-1)*pageSize + 1); // 定位到頁首行
// 讀取 pageSize 行...

2. 可更新游標(原地修改)

Statement stmt = conn.createStatement(
    ResultSet.TYPE_SCROLL_INSENSITIVE, // 或 FORWARD_ONLY
    ResultSet.CONCUR_UPDATABLE
);
ResultSet rs = stmt.executeQuery("SELECT id, name, balance FROM accounts WHERE id=1");
if (rs.next()) {
    rs.updateDouble("balance", rs.getDouble("balance") + 100);
    rs.updateRow(); // 提交修改到資料庫
}

3. 插入新行

rs.moveToInsertRow();
rs.updateString("name", "New User");
rs.updateDouble("balance", 0);
rs.insertRow();
rs.moveToCurrentRow();

六、關鍵限制與最佳實踐

  1. 主鍵要求:`CONCUR_UPDATABLE` 通常要求查詢包含主鍵列,且表有主鍵/唯一索引。
  2. 單表查詢:可更新游標通常僅支援單表查詢,連接查詢、視圖多不支援。
  3. 性能開銷:滾動/可更新游標在客戶端/服務端緩存更多元據,內存/網絡開銷大,**大數據集慎用**。
  4. 資源關閉:`ResultSet`、`Statement`、`Connection` 必須在 `finally` 或 `try-with-resources` 中關閉。
  5. 現代替代**:分頁用 `LIMIT/OFFSET` 或 `PageHelper`;更新用 `PreparedStatement` + `UPDATE SQL`,避免可更新游標的複雜性與移植性問題。

七、總結

`createStatement(type, concurrency)` 靈活控制 `ResultSet` 行為:

  • 預設 `FORWARD_ONLY` + `READ_ONLY` 性能最佳,適合 90% 場景。
  • 需隨機訪問/分頁 → `SCROLL_INSENSITIVE` + `READ_ONLY`。
  • 需原地更新/插入刪除 → `SCROLL_INSENSITIVE` + `UPDATABLE`(驗證資料庫支援)。
  • `SCROLL_SENSITIVE` 理論美好但實際支援極差,生產環境慎用。

理解這些選項,能在遺留系統維護或特殊需求下做出正確選擇;新專案優先考慮 SQL 層面解決分頁與更新。

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