SQL Server 集群的 JDBC 连接字符串

Posted

技术标签:

【中文标题】SQL Server 集群的 JDBC 连接字符串【英文标题】:JDBC connect string for SQL Server cluster 【发布时间】:2009-07-21 15:41:36 【问题描述】:

我需要设置一个到 SQL Server 的 JDBC 连接字符串。 这个问题类似于C# ADO.Net connection question。这是特定于 JDBC 连接字符串的。

JDBC 字符串的常用格式是“jdbc:sqlserver://host:port”。 现在,对于 SQL 服务器集群,我有一个集群名称 vvv\iii (virtual serverinstance name)。

使用 vvv\iii 字符串作为服务器名称时,通过“到 SQL Server 的新数据源”向导设置 ODBC 连接没有问题。但是,似乎 JDBC 连接字符串需要特定的主机和端口。

有没有办法让 JDBC 连接字符串到 SQL Server 集群?

【问题讨论】:

【参考方案1】:

事实证明,您可以在 JDBC 字符串中使用“instanceName”属性,如“命名和多个 SQL Server 实例”部分中的 Microsoft Technet page 中所述。对我来说有效的是虚拟服务器 vvv 和数据库实例名称 iii 的以下字符串:

"jdbc:sqlserver://vvv;instanceName=iii"

【讨论】:

我不喜欢接受自己的答案,但这是迄今为止最好的答案 ;-)【参考方案2】:

在集群或独立环境中使用 SQL Server 命名实例时,每个 SQL Server 实例都会在启动时动态分配一个端口号。 SQL Server Browser 服务器处理对每个实例的请求,因为每次服务器重新启动都可能更改每个实例使用的端口号。在服务器重新启动时启动的第一个实例分配为 1433,但如果您有 2 个实例,则无法保证其中一个将始终获得 1433。有几个变量会影响实例启动所需的启动和恢复时间。这可以每次改变。

这很可悲......当连接到一个命名实例时,jdbc 连接字符串应该如下所示: jdbc:sqlserver://server_name/db_name;instance=instance_name

而不是这个 jdbc:sqlserver://server_name:1433/db_name;instance=instance_name

请注意,默认数据库“/db_name”是可选的。如果排除连接将使用分配给 SQL Server 登录的默认数据库。

【讨论】:

【参考方案3】:

集群资源有一个主机名和一个监听端口。使用 jdbc:sqlserver://virtualserver:1433(如果不监听默认端口,则使用适当的监听端口)。

【讨论】:

【参考方案4】:

我会评论Mark Stewart 的评论,但缺乏声誉。 My source 没有提到 /db_name 我也无法让它工作。可能是confused instance names 的另一个案例?

【讨论】:

【参考方案5】:

请确保您关闭端口定义,因为集群会为您确定这一点。

所以我的数据源定义如下:

jdbc:sqlserver://sqlcluster_hostname\instancename;DATABASENAME=databasename;sendStringParametersAsUnicode=false;SelectMethod=direct

我在尝试设置 Railo 数据源以连接到 MSSQL 集群时遇到了这个问题。

稍微偏离主题...如果您将端口字段留空,则标准 Railo 数据源 MSSQL 驱动程序选项将端口设置为“-1”,但是如果将其设置为“0”,则它会完全删除端口定义,然后是所有内容作品。但最好的方法是选择“Other - JDBC Driver”来完整定义JDBC连接字符串。

【讨论】:

以上是关于SQL Server 集群的 JDBC 连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在火花中使用 sql server 2012 jdbc jar

JDBC无法与SQL Server建立SSL连接(Domino Java Agent FP 9)

如何使用 JDBC 连接到 SQL Server 2008 数据库?

使用JDBC连接SQL SERVER的数据库后,读取出来的中文数据是乱码?

android 使用jdbc1.3.0 操作 sql server

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