帶有 beginRequest
和 endRequest
方法的新 JDBC 4.3 連接請求功能是什麼?
JDBC 4.3 更新隨Java 9 2017-10一起發布。在它的幾個變化
Connection
中,新特性beginRequest
和endRequest
方法發出信號……向驅動程序提示一個請求,一個獨立的工作單元,正在此連接上開始。每個請求都獨立於客戶端或伺服器上連接的本地狀態的所有其他請求。在 beginRequest 和 endRequest 對之間完成的工作不依賴於在連接上完成的任何其他工作,無論是作為另一個請求的一部分還是在任何請求之外。一個請求可能包括多個事務。送出的數據庫狀態可能存在依賴關係,因為它不是連接本地的。
…和…
… 是可選的,特定於供應商的,並且應該在很大程度上是透明的。
➠ 請說明此功能的用途。
它似乎是關於比事務更大的東西,但不是關於兩階段送出。它是否與sharding相關,這是 JDBC 4.3 中的主要新特性?
它是某種包含多個事務的範圍嗎?
哪些數據庫使用此功能?
- 特別是Postgres、H2或Microsoft SQL Server是否具有這樣的功能?
我不是在問這些數據庫是否已經為 JDBC 4.3 更新了JDBC 驅動程序。我問的是更大的圖景,在跨連接的數據庫連接的上下文中,“請求”的含義和目的是什麼。
奇怪的是,JDBC 4.3 規範只提到了這一點,沒有解釋:
JDBC API 更改
對現有 JDBC 介面進行了以下更改。
java.sql.Connection
添加了方法
beginRequest
,endRequest
,setShardingKey
,setShardingKeyIfValid
.
這些新的 JDBC4.3 API
beginRequest
與endRequest
連接管理有關。它實際上是連接池向驅動程序提供的一個提示,即連接已從池中檢出 (beginRequest
) 或重新檢入池 (endRequest
)。如果沒有這些 API,驅動程序實際上對請求邊界一無所知。然後,驅動程序可以使用這些請求劃分來做髒衣服,比如 ping 數據庫、替換沒有另一個連接的連接以進行負載平衡、清除臟狀態等。這些 API 在 JDBC4.3 之前的 Oracle JDBC 瘦驅動程序中被定義為 Oracle 特定的 API。Oracle 的 UCP(通用連接池)已經呼叫了這些 API。現在它們是標準的一部分,其他連接池可以開始使用它們(其他驅動程序將實現它們)。