具有“beginRequest”和“endRequest”方法的新 JDBC 4.3 连接请求功能是什么?

Bas*_*que 2 postgresql jdbc java sharding

JDBC 4.3 更新 Java 9 2017-10一起发布。它的几个变化之一是关于和方法发出信号\xe2\x80\xa6 的新功能ConnectionbeginRequestendRequest

\n\n
\n

向驱动程序提示一个请求(一个独立的工作单元)正在此连接上开始。每个请求都独立于客户端或服务器上连接的本地状态的所有其他请求。beginRequest、endRequest 对之间完成的工作不依赖于连接上完成的任何其他工作,无论是作为另一个请求的一部分还是在任何请求之外。一个请求可能包含多个事务。可能存在对已提交数据库状态的依赖性,因为它不是连接本地的。

\n
\n\n

\xe2\x80\xa6 和 \xe2\x80\xa6

\n\n
\n

\xe2\x80\xa6 是可选的,特定于供应商的,并且应该在很大程度上是透明的。

\n
\n\n

\xe2\x9e\xa0 请解释一下此功能的用途。

\n\n

它似乎是关于比事务更大的事情,但与两阶段提交无关。与JDBC 4.3 的主要新特性sharding有关吗?

\n\n
    \n
  • 它是某种包含多个事务的范围吗?
  • \n
  • 哪些数据库使用了此功能?\n\n
  • \n
\n\n

我并不是在询问这些数据库是否已针对 JDBC 4.3 更新了JDBC 驱动程序。我问的是更大的情况,在跨连接的数据库连接上下文中“请求”的含义和目的是什么。

\n\n

奇怪的是,JDBC 4.3 规范只提到了这一点,没有任何解释:

\n\n
\n

JDBC API 更改

\n\n

对现有 JDBC 接口进行了以下更改。

\n\n

java.sql.Connection

\n\n

添加了方法beginRequest, endRequest, setShardingKey,\n setShardingKeyIfValid

\n
\n

小智 5

这些新的 JDBC4.3 APIbeginRequestendRequest连接管理有关。它实际上是连接池向驱动程序提供的一个提示,表明连接已从池中检出 ( beginRequest) 或重新检入池中 ( endRequest)。如果没有这些 API,驱动程序实际上对请求边界一无所知。然后,驱动程序可以使用这些请求划分来进行一些肮脏的工作,例如 ping 数据库、替换连接而不使用另一个连接来实现负载平衡、清除脏状态等。

在 JDBC4.3 之前,这些 API 在 Oracle JDBC 瘦驱动程序中被定义为 Oracle 特定 API。Oracle的UCP(通用连接池)已经调用了这些API。现在它们已成为标准的一部分,其他连接池可以开始使用它们(并且其他驱动程序将实现它们)。