通过动态TCP端口与SQL Server的JDBC连接

时间:2018-10-19 13:42:57

标签: java sql-server jdbc tcp mssql-jdbc

我的SQL Server引擎正在使用动态TCP端口,例如52358。如果我在JDBC DB URL连接字符串中指定了端口号52358,则可以进行JDBC查询而没有任何问题,

size

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

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


我尝试过的方法

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

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

这不起作用。顺便说一句,SQL Server浏览器服务已启用。


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

jdbc:sqlserver://serverName;databaseName=myDB

其中portNumber或instanceName可用于连接到serverName。但是,

  

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

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

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

此外,我们应该记住

  

为获得最佳连接性能,应在以下情况下设置端口号:   您连接到命名实例。这样可以避免往返于   服务器确定端口号

这将要求一个静态端口号。

2 个答案:

答案 0 :(得分:3)

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

默认实例:

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

命名实例

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

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

答案 1 :(得分:0)

如果您看到官方文档here,他们说该端口是可选的(建议您放置一个),但是请参阅以下说明:

  

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

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