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

问题描述 投票:2回答:2

我的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://serverName\instanceName;databaseName=myDB

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

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

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

java sql-server jdbc tcp mssql-jdbc
2个回答
3
投票

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

默认实例:

jdbc:sqlserver://servername\MSSQLSERVER;...

命名实例

jdbc:sqlserver://servername\instancename;...

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.