我的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]]
此外,我们应该记住
为获得最佳连接性能,应在以下情况下设置端口号: 您连接到命名实例。这样可以避免往返于 服务器确定端口号
这将要求一个静态端口号。
答案 0 :(得分:3)
如果您真的不能指望端口号保持不变,则必须使用SQL Server实例名称进行连接。
默认实例:
jdbc:sqlserver://servername\MSSQLSERVER;...
命名实例
jdbc:sqlserver://servername\instancename;...
当然,这意味着SQL Browser服务必须在服务器上运行,以便实例名称可以解析为当前使用的实际端口号。
答案 1 :(得分:0)
如果您看到官方文档here,他们说该端口是可选的(建议您放置一个),但是请参阅以下说明:
为获得最佳连接性能,应在连接到命名实例时设置portNumber。这样可以避免往返服务器以确定端口号。如果同时使用portNumber和instanceName,则portNumber将优先,而instanceName将被忽略。
我在这里可以理解,如果您省略端口,驱动程序会进行一些扫描操作以确定要使用哪个端口,请尝试不放置端口。 但是请记住,他们建议为获得最佳性能而明确选择一个。