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