在我们的项目中,有一项要求是支持Postgres(Postgresql驱动程序)的"jdbc超时"功能。我们还支持Microsoft SQL(JTDS驱动程序)和MySQl(MySQl驱动程序)。因此,我想介绍"loginTimeout"作为所有数据库的通用功能。
在查看驱动程序文档时,我发现JTDS和Postgresql驱动程序都支持一个名为"loginTimeout"的jdbc参数,但Msql不支持
http://jtds.sourceforge.net/faq.html
loginTimeout (默认值-0表示TCP/IP连接,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
设置决定客户端尝试打开网络连接的时间;它没有声明数据库本身将进行身份验证或运行,只声明可以建立套接字。
相比之下,Postgres表示连接到数据库的最长时间;如果您的命令在超时之前返回,那么数据库将接收到网络请求并在适当的时间内做出响应。
因此,在一种情况下,您只是对网络行为施加了限制(即,您等待多长时间才能将套接字连接到该端口的服务器);在另一种情况下,您对数据库的行为(即,等待数据库本身连接的时间)施加约束。
附带说明一下,接口javax.sql.CommonDataSource
为getLoginTimeout
指定了JDBC属性,该属性模仿了PostgreSQL属性的行为。当您查看MysqlDataSource(例如mariadb)的各种实现时,这些方法没有实现;这通常让我相信MySQL中没有直接的相似之处。