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。现在它们是标准的一部分,其他连接池可以开始使用它们(其他驱动程序将实现它们)。