【问题标题】:JDBC Connection to SQL server with Dynamic TCP Ports使用动态 TCP 端口与 SQL 服务器的 JDBC 连接
【发布时间】:2018-10-19 13:42:57
【问题描述】:

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

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

但是,由于这是动态端口,如果下次重启sql server后该端口(52358)不可用,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。不过,

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

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

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

另外,我们应该记住

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

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

【问题讨论】:

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


    【解决方案1】:

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

    默认实例:

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

    命名实例

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

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

    【讨论】:

      【解决方案2】:

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

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

      这里可以理解,如果省略端口,驱动会做一些软扫描来确定使用哪个端口,试试不放端口。 但请记住,为了获得最佳性能,他们建议明确选择一个。

      【讨论】:

      • 事实并非如此。我已经阅读了文档。它说“默认值为 1433。如果您使用默认值,则不必在 URL 中指定端口,也不必指定其前面的 ':'。”。因此,如果您省略端口,则意味着您使用的是默认的 1433 端口。但我的问题在于动态端口。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-23
      • 1970-01-01
      • 2010-09-13
      • 2021-08-12
      • 2019-08-15
      • 2016-01-24
      相关资源
      最近更新 更多