我们的项目需要支持 Postgres(Postgresql 驱动程序)的“jdbc 超时”功能。 我们还支持 Microsoft SQL(JTDS 驱动程序)和 MySQl(mysql 驱动程序)。所以我想引入“loginTimeout”作为所有数据库的共同功能。
在查看驱动程序文档时,我发现 JTDS 和 Postgresql 驱动程序都支持一个名为“loginTimeout”的 jdbc 参数,但 Msql 不支持
http://jtds.sourceforge.net/faq.html
loginTimeout(对于 TCP/IP 连接,默认为 0;对于命名管道连接,默认为 20)等待成功的时间(以秒为单位) 超时之前的连接。如果使用 TCP/IP 连接 连接到数据库并且正在使用 Java 1.4 或更高版本, loginTimeout参数用于设置初始连接超时时间 最初打开一个新套接字时。值为零(默认值) 导致连接无限期等待,例如,直到连接建立 已建立或发生错误。另请参见套接字超时。如果一个命名的 使用管道连接(namedPipe为true)并且loginTimeout为 大于零时,loginTimeout 的值用于长度 当“所有管道实例都忙”错误消息时的重试周期 尝试连接到服务器时收到。如果登录超时是 零(默认值),命名管道使用 20 秒的值 重试期。
http://jdbc.postgresql.org/documentation/84/connect.html
loginTimeout = int 指定等待建立的时间 数据库连接。超时以秒为单位指定。
但是对于Mysql来说,没有像loginTimeout这样的东西,但是有
connectTimeout:socket连接的超时时间(以毫秒为单位),0 没有超时。仅适用于 JDK-1.4 或更高版本。默认为“0”
所以我的问题是“connectTimeout 和 loginTimeout 之间有什么区别”,它们的功能相同吗?
MySQL 的
socketConnect
设置决定客户端将尝试打开网络连接的时间;它没有声明数据库本身将进行身份验证或运行,只是可以建立套接字。
相比之下,Postgres 指示连接到数据库的最长时间;如果您的命令在超时之前返回,则数据库收到网络请求并在适当的时间内做出响应。因此,在一种情况下,您只是对网络行为施加限制(即,您等待将套接字连接到该端口上的该服务器的时间);另一方面,您对数据库
行为施加限制(即等待数据库本身连接的时间)。
顺便说明一下,接口 javax.sql.CommonDataSource
getLoginTimeout
的 JDBC 属性,它模仿了 PostgreSQL 属性的行为。当您查看 MysqlDataSource 的各种实现(例如,mariadb
)时,您会发现这些方法并未实现;这通常让我相信 MySQL 中没有直接的类似物。