在我们的项目中,需要为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参数用于设置初始连接超时
最初打开新插座时。值为零(默认值)
导致连接无限期等待,例如,直到连接
已建立或发生错误。另请参见socketTimeout。如果
使用管道连接(namedPipe为true),loginTimeout为
大于零时,loginTimeout的值用于
“所有管道实例都忙”错误消息的重试周期为
尝试连接到服务器时收到。如果loginTimeout是
零(默认值),命名管道使用20秒的值
重试周期。
http://jdbc.postgresql.org/documentation/84/connect.html
loginTimeout=int指定等待建立
数据库连接。超时以秒为单位指定。
但是对于Mysql来说,没有什么比loginTimeout更好的了,但是
connectTimeout:套接字连接超时(毫秒),0
没有超时。仅适用于JDK-1.4或更新版本。默认为“0”
所以我的问题是“connectTimeout和loginTimeout有什么区别”,它们是否具有相同的功能?
最佳答案
MySQL的socketConnect
设置决定客户端尝试打开网络连接的时间;它不声明数据库本身将进行身份验证或运行,只声明可以建立套接字。
相比之下,PistGRE表示连接到数据库的最大时间;如果命令在超时之前返回,则数据库接收到网络请求并在适当的时间内作出响应。
因此,在一种情况下,您只对网络行为施加约束(即您等待将套接字连接到该端口上的服务器的时间);在另一种情况下,您对数据库行为施加约束(即等待数据库本身连接的时间)。
另外,接口javax.sql.CommonDataSource
为getLoginTimeout
指定了一个JDBC属性,该属性模仿PostgreSQL属性的行为。当您查看MysqlDataSource的各种实现(例如,mariadb)时,这些方法并没有实现;这通常会使我认为MySQL中没有直接的模拟。