JDBC连接到具有动态TCP端口的SQL Server

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC连接到具有动态TCP端口的SQL Server相关的知识,希望对你有一定的参考价值。

我的sql server引擎正在使用动态TCP端口,例如52358.如果我在JDBC DB url连接字符串中指定了端口号52358,我可以毫无问题地进行JDBC查询,即

jdbc:sqlserver://serverName:52358;databaseName=myDB

但是,由于这是动态端口,如果此端口(52358)在下次重新启动sql server后变为不可用,则sql server可能会选择另一个端口。

那么在连接字符串中配置数据库URL的最佳方法是什么?


方法我尝试过:

省略端口号并仅使用实例名称,即

jdbc:sqlserver://serverName;databaseName=myDB

这不起作用。顺便说一句,sql server浏览器服务已经启用。


找到解决方案(感谢Gord Thompson)。 DB URL的complete form是:

jdbc:sqlserver://[serverName[instanceName][:portNumber]][;property=value[;property=value]]

其中portNumber或instanceName可用于连接到serverName。然而,

如果同时使用端口号和实例名,则端口号优先,并且将忽略instanceName。

因此,对于动态端口的情况,我们应该只使用instanceName进行连接并保持SQL Browser服务运行(SQL Server提供SQL Server Browser Service,监视端口,并将传入连接定向到该实例的当前端口)。因此,就我而言,正确的形式是:

jdbc:sqlserver://serverNameinstanceName;databaseName=myDB

另外,我们应该记住这一点

为获得最佳连接性能,应在连接到命名实例时设置portNumber。这将避免往返服务器以确定端口号

然后这将调用静态端口号。

答案

如果您真的不能指望端口号保持不变,那么您将不得不使用SQL Server实例名称进行连接。

默认实例:

jdbc:sqlserver://servernameMSSQLSERVER;...

命名实例

jdbc:sqlserver://servernameinstancename;...

当然,这意味着必须在服务器上运行SQL Browser服务,以便可以将实例名称解析为当前正在使用的实际端口号。

另一答案

如果你看到Oficial docs here,他们说端口是可选的(他们建议你放一个),但请看这个说明:

为获得最佳连接性能,应在连接到命名实例时设置portNumber。这将避免往返服务器以确定端口号。如果同时使用portNumber和instanceName,则portNumber将优先,并且将忽略instanceName。

我在这里可以理解,如果省略端口,驱动程序会进行一些软扫描以确定使用哪个端口,尝试不放入端口。但请记住,他们建议最佳性能,明确选择一个。

以上是关于JDBC连接到具有动态TCP端口的SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

java连接sql server报错:com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 localhost 的 TCP/

java连接sql server报错:com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机 localhost 的 TCP/

Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败

sql server 2008 com.microsoft.sqlserver.jdbc.SQLServerException: 通过端口 1433 连接到主机

JDBC 通过端口 1433 连接到主机 localshost 的 TCP/IP 连接失败。错误:“null。

JAVA 连接SQLSEVER 2008