我正在尝试添加服务器作为 SQL Server 的故障转移,但它没有使用端口
1443
,我正在使用端口 2776
。我试图指定它,但我尝试的一切都不起作用。我怎么能这么做呢?
private String url = "jdbc:sqlserver://server1:2776;DatabaseName=db;failoverPartner=server2";
我尝试了以下配置,但没有一个起作用。
...failoverPartner=server2:2776
...failoverPartner=server2,2776
...failoverPartner=server2\\db
但每次我都会遇到异常。
com.microsoft.sqlserver.jdbc.SQLServerException:与主机 server2 端口 1433 的 TCP/IP 连接失败。错误:“连接超时。请验证连接属性,检查 SQL Server 实例是否正在主机上运行并在端口上接受 TCP/IP 连接,并且没有防火墙阻止与该端口的 TCP 连接。”。
com.microsoft.sqlserver.jdbc.SQLServerException:与主机 server2:2776、端口 1433 的 TCP/IP 连接失败。错误:“null。验证连接属性,检查 SQL Server 实例是否正在主机上运行并接受端口上的 TCP/IP 连接,并且没有防火墙阻止与该端口的 TCP 连接。”。
com.microsoft.sqlserver.jdbc.SQLServerException:与主机 server2、2776、端口 1433 的 TCP/IP 连接失败。错误:“null。验证连接属性,检查 SQL Server 实例是否正在主机上运行并接受端口上的 TCP/IP 连接,并且没有防火墙阻止到该端口的 TCP 连接。”。
来自文档 使用 JDBC 驱动程序连接到 SQL Server - 设置连接属性文档,属性
failoverPartner
:
注意: 驱动程序不支持将故障转移伙伴实例的服务器实例端口号指定为连接字符串中的failoverPartner 属性的一部分。但是,支持在同一连接字符串中指定主体服务器实例的 serverName、instanceName 和 portNumber 属性以及故障转移伙伴实例的failoverPartner 属性。
措辞非常混乱,但看起来您无法为故障转移服务器指定端口号。
来自 Microsoft 的 KB-2284190(在连接字符串的failoverPartner属性中使用端口号时,应用程序无法连接到镜像合作伙伴服务器)我几乎读到了相同的内容:
原因
出现这两条错误消息的原因是 SQL Server JDBC 驱动程序(所有版本)不支持解析 FailoverPartner 连接字符串属性的端口号,并依赖 DNS 和 SQL Server Browser 服务(仅适用于命名实例)来解析连接合作伙伴服务器的信息。 在满足症状部分中讨论的条件的环境中,JDBC 驱动程序无法解析合作伙伴服务器信息,因此您会收到上面讨论的错误消息。
SQL 镜像基础设施的这种行为是设计使然。因此,Microsoft JDBC 驱动程序版本 3.0 仅支持格式为
[\ ] 的故障转移伙伴属性值。 解决方案
要解决此问题,请在涉及数据库镜像的环境中使用以下方法之一:
对于属于镜像配置一部分的 SQL Server 默认实例,请确保它们正在侦听 TCP 连接的默认端口 1433。
对于命名实例,请确保 SQL 浏览器服务正在运行,并且网络上的 1434 端口没有被阻止,并且服务器 B 没有配置为隐藏实例。
总之,请执行以下操作之一:
failoverPartner
指定为 server_name\instance_name
。确保 SQL Server Browser 服务正在运行并且端口 1434 未被阻止。您可以通过以下方式在 jdbc url 中指定端口:
private String url = "jdbc:sqlserver://server1;DatabaseName=db;failoverPartner=server2;port=2776";
做$$ 宣布 -- 变量声明 item_id INT; o1 文本; o2 文本; o3 文本; o4 文本; o5 文本; o6 文本; o7 文本; o8 文本; o9 文本; o10 文本; o11 文本; o12 文本; o13 文本; o14 文本; o15 文本; o16a 文本; o16b 文本; o17 文本; o18 文本; 开始 -- 获取第一个item_id 选择最小值(id) INTO item_id 来自 DTE_ENTITY_ITEM 其中 DTE_ENTITY_ID = 104 且 STATUS_ID = 1 AND 创建的日期时间 > CAST('2024-03-31' AS TIMESTAMP);
-- Print the report header
RAISE NOTICE 'Suspend Type | Date | Window | Point Name | Appl ID | File ID | Batch Number | S/D | Suspended Reason | Suspended Totals Debits | Suspended Totals Credits | Comments | Reset Window | Reset Type | Reset By | Reset Date | Delete/Reset Totals Debit | Delete/Reset Totals Credit';
-- Loop through all items
WHILE item_id IS NOT NULL LOOP
-- Fetch values into variables
SELECT original_value
INTO o1
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10401 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o2
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10402 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT STRING_VALUE
INTO o3
FROM the_window_view
WHERE DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o4
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10404 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o5
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10405 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT replace(replace(original_value, '0', 'NO'), '1', 'YES')
INTO o6
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10408
AND STATUS_ID = 1 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o7
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10409 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o8
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10410 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o9
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10411 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT STRING_VALUE
INTO o10
FROM the_window_view
WHERE DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o11
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10412 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o12
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10413 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o13
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10414 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o14
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10415 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o15
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10416 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT STRING_VALUE
INTO o16a
FROM the_window_view
WHERE DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o16b
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10417 AND DTE_ENTITY_ITEM_ID = item_id;
SELECT original_value
INTO o17
FROM DTE_ENTITY_DATA
WHERE DTE_ENTITY_FIELD_ID = 10418 AND DTE_ENTITY_ITEM_ID = item_id;
-- Print the fetched data
RAISE NOTICE 'o1: %, o2: %, o3: %, o4: %, o5: %, o6: %, o7: %, o8: %, o9: %, o10: %, o11: %, o12: %, o13: %, o14: %, o15: %, o16a: %, o16b: %, o17: %',
o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12, o13, o14, o15, o16a, o16b, o17;
-- Fetch the next item_id for the loop
SELECT MIN(id)
INTO item_id
FROM DTE_ENTITY_ITEM
WHERE DTE_ENTITY_ID = 104 AND STATUS_ID = 1
AND id > item_id;
END LOOP;
结束$$;