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

时间:2019-05-22 16:56:26

标签: postgresql jdbc database-connection pg-jdbc

在pgjdbc中,我们有:

  • loginTimeout
  • connectTimeout
  • socketTimeout
  • cancelSignalTimeout

但是我不清楚loginTimeoutconnectTimeoutsocketTimeout之间的区别(何时应用)。

2 个答案:

答案 0 :(得分:1)

阅读源代码后,我会说是这样的:

  • connectTimeout指定等待建立TCP网络连接的时间

  • loginTimeout指定允许登录数据库的整个过程花费多长时间

  • socketTimeout指定客户端在引发错误之前将等待服务器响应命令的时间

前两个与建立连接有关,第三个与整个数据库会话有关。

建立TCP连接是建立数据库连接的一部分。

答案 1 :(得分:1)

PostgreSQL JDBC documentation中所述:

  
      
  • loginTimeout = int

         

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

  •   
  • connectTimeout = int

         

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

  •   
  • socketTimeout = int

         

    用于套接字读取操作的超时值。如果从阅读   服务器花费的时间超过此值,则连接已关闭。   既可以用作蛮力全局查询超时,也可以用作   检测网络问题的方法。超时在   秒和零值表示已禁用。

  •   
  • cancelSignalTimeout = int

         

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

  •   

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

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

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

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