使用动态TCP端口连接SQL服务器的JDBC连接

4

我的 MySQL 服务器引擎正在使用动态 TCP 端口,例如 52358。如果我在 JDBC DB url 连接字符串中指定端口号 52358,则可以毫无问题地进行 JDBC 查询。

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

然而,由于这是动态端口,如果下次重新启动 SQL Server 后该端口(52358)不可用,则 SQL Server 可能会选择另一个端口。

那么,在连接字符串中配置我的 DB URL 的最佳方法是什么?


我尝试的方法

省略端口号,只使用实例名称,即:

jdbc:sqlserver://serverName;databaseName=myDB

这个不起作用。顺便说一下,SQL Server浏览器服务已经启用。
找到解决方案(感谢Gord Thompson)。DB URL的完整格式是:完整形式
jdbc:sqlserver://[serverName[\instanceName][:portNumber]][;property=value[;property=value]]

无论是使用portNumber还是instanceName连接到serverName都是可行的。但是,

如果同时使用portNumber和instanceName,则portNumber将优先,并且instanceName将被忽略。

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

jdbc:sqlserver://serverName\instanceName;databaseName=myDB

此外,我们应该记住:

为了获得最佳的连接性能,在连接到命名实例时应设置端口号。这将避免向服务器发送请求以确定端口号。

因此,这将需要一个静态端口号。

2个回答

4
如果您无法确保端口号始终不变,那么您将需要使用SQL Server实例名称进行连接。
默认实例:
jdbc:sqlserver://servername\MSSQLSERVER;...

命名实例

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

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

0

如果您查看官方文档此处, 它们说端口是可选的(他们建议您放一个),但请注意以下注释:

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

我可以理解,如果您省略端口,那么驱动程序会进行某种扫描以确定要使用哪个端口,请尝试不使用端口。 但请记住,为了获得最佳性能,他们建议明确选择一个端口。


这并不是这样的。我已经阅读了文档。它说:“默认值为1433。如果您使用默认值,则无需在URL中指定端口或其前面的“:”。因此,如果您省略端口,则表示您正在使用默认的1433端口。但我的问题是动态端口。 - Peng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接