在 pgjdbc 我们有:
loginTimeoutconnectTimeoutsocketTimeoutcancelSignalTimeout
但我不清楚loginTimeout,connectTimeout和之间有什么区别(何时应用) socketTimeout。
在 pgjdbc 我们有:
loginTimeoutconnectTimeoutsocketTimeoutcancelSignalTimeout但我不清楚loginTimeout,connectTimeout和之间有什么区别(何时应用) socketTimeout。
如PostgreSQL JDBC 文档中所述:
登录超时= int
指定等待建立数据库连接的时间。超时以秒为单位指定。
连接超时= int
用于套接字连接操作的超时值。如果连接到服务器的时间超过此值,则连接中断。超时以秒为单位指定,零值表示它被禁用。
socketTimeout = int
用于套接字读取操作的超时值。如果从服务器读取的时间超过此值,则连接将关闭。这可以用作暴力全局查询超时和检测网络问题的方法。超时以秒为单位指定,零值表示它被禁用。
取消信号超时= int
取消命令是通过自己的连接带外发送的,因此取消消息本身可能会卡住。此属性控制用于取消命令的“连接超时”和“套接字超时”。超时以秒为单位指定。默认值为 10 秒。
connectTimeout和socketTimeout是低级套接字操作的超时。connectTimeout控制建立 TCP 套接字连接所需的时间。建立 TCP 连接并不能保证登录(它甚至不能保证您连接到 PostgreSQL 服务器,只是连接到接受 TCP 连接的东西)。AsocketTimeout控制可以阻塞套接字等待从套接字读取的时间。这涉及来自服务器的所有读取,不仅在连接期间,而且在与服务器的后续交互期间(例如执行查询)。
另一方面loginTimeout控制连接和认证到 PostgreSQL 服务器的 PostgreSQL 协议操作。这涉及建立一个 TCP 连接,然后是一个或多个数据包交换,用于与 PostgreSQL 服务器的握手和身份验证(我不熟悉 PostgreSQL 协议的细节,所以我不能很具体)。
交换这些数据包可能需要额外的时间,或者如果您连接到不是 PostgreSQL 服务器的东西,数据包交换可能会停止。可以通过仔细控制connectTimeout和来解决这个问题socketTimeout,但不能保证(例如正在交换数据,但登录永远不会完成)。此外,由于socketTimeout还管理连接上的所有其他操作,您可能希望将其设置为高于您愿意等待登录完成的值(例如,对于需要很长时间才能获得响应的其他操作)。
用作用于取消命令的单独 TCP 连接的cancelSignalTimeout连接和套接字超时。
阅读源代码后,我会说它是这样的:
connectTimeout指定等待 TCP 网络连接建立的时间
loginTimeout指定登录到数据库的整个过程允许花费多长时间
socketTimeout指定客户端在抛出错误之前等待服务器对命令的响应多长时间
前两个与建立连接有关,第三个与整个数据库会话有关。
建立 TCP 连接是建立数据库连接的一部分。