pgjdbc中的loginTimeout、connectTimeout和socketTimeout有什么区别

mFe*_*ein 6 postgresql database-connection jdbc pg-jdbc

在 pgjdbc 中我们有:

  • loginTimeout
  • connectTimeout
  • socketTimeout
  • cancelSignalTimeout

但我不清楚 ,loginTimeoutconnectTimeout之间有什么区别(它们何时应用) socketTimeout

Mar*_*eel 3

如PostgreSQL JDBC 文档中所述:

  • 登录超时= int

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

  • 连接超时= int

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

  • 套接字超时= int

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

  • 取消信号超时= int

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

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

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

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

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