首页 > 解决方案 > pgjdbc中的loginTimeout、connectTimeout和socketTimeout有什么区别

问题描述

在 pgjdbc 我们有:

但我不清楚loginTimeout,connectTimeout和之间有什么区别(何时应用) socketTimeout

标签: postgresqljdbcdatabase-connectionpg-jdbc

解决方案


PostgreSQL JDBC 文档中所述:

  • 登录超时= int

    指定等待建立数据库连接的时间。超时以秒为单位指定。

  • 连接超时= int

    用于套接字连接操作的超时值。如果连接到服务器的时间超过此值,则连接中断。超时以秒为单位指定,零值表示它被禁用。

  • socketTimeout = int

    用于套接字读取操作的超时值。如果从服务器读取的时间超过此值,则连接将关闭。这可以用作暴力全局查询超时和检测网络问题的方法。超时以秒为单位指定,零值表示它被禁用。

  • 取消信号超时= int

    取消命令是通过自己的连接带外发送的,因此取消消息本身可能会卡住。此属性控制用于取消命令的“连接超时”和“套接字超时”。超时以秒为单位指定。默认值为 10 秒。

connectTimeoutsocketTimeout是低级套接字操作的超时。connectTimeout控制建立 TCP 套接字连接所需的时间。建立 TCP 连接并不能保证登录(它甚至不能保证您连接到 PostgreSQL 服务器,只是连接到接受 TCP 连接的东西)。AsocketTimeout控制可以阻塞套接字等待从套接字读取的时间。这涉及来自服务器的所有读取,不仅在连接期间,而且在与服务器的后续交互期间(例如执行查询)。

另一方面loginTimeout控制连接和认证到 PostgreSQL 服务器的 PostgreSQL 协议操作。这涉及建立一个 TCP 连接,然后是一个或多个数据包交换,用于与 PostgreSQL 服务器的握手和身份验证(我不熟悉 PostgreSQL 协议的细节,所以我不能很具体)。

交换这些数据包可能需要额外的时间,或者如果您连接到不是 PostgreSQL 服务器的东西,数据包交换可能会停止。可以通过仔细控制connectTimeout和来解决这个问题socketTimeout,但不能保证(例如正在交换数据,但登录永远不会完成)。此外,由于socketTimeout还管理连接上的所有其他操作,您可能希望将其设置为高于您愿意等待登录完成的值(例如,对于需要很长时间才能获得响应的其他操作)。

用作用于取消命令的单独 TCP 连接的cancelSignalTimeout连接套接字超时。


推荐阅读