postgresql - pgjdbc中的loginTimeout、connectTimeout和socketTimeout有什么区别
问题描述
在 pgjdbc 我们有:
loginTimeout
connectTimeout
socketTimeout
cancelSignalTimeout
但我不清楚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
连接和套接字超时。
推荐阅读
- r - 在 R 中使用 round_date() 舍入日期
- php - 无法删除或更新父行,即使 SQL 语句首先更改表
- mysql - kafka-connect 到同步数据库的硬删除事件不起作用或出现错误
- python - columnspecs 不匹配,因此使用 pd.read_fwf 和使用 colspecs 读取值错误
- sql - 查找日期列的最大值并为组的所有行显示该值
- powershell - 使用特定文件名作为参数在 Powershell 中运行可执行文件
- javascript - 可以以字符串结尾、# 或 - 结尾的正则表达式
- amazon-web-services - 如何在不设置 lambda 的情况下在 apigateway http_proxy 上添加 CORS?
- parsing - 如何使用 Logstash 解析信息?
- python - 在 matplotlib 中更改多行的线条样式