不能,Load_Balance=true仅启用客户端负载均衡开关,实际分发依赖ADDRESS_LIST中至少两个独立ADDRESS块及Oracle Net轮询逻辑。
Load_Balance=true 能自动实现连接分发吗?
不能,它只是启用客户端负载均衡的开关,实际分发行为依赖 address_list 中多个 address 的配置顺序和 oracle net 的轮询逻辑。如果只写一个地址,哪怕 load_balance=true 也毫无意义。
常见错误是把 RAC 的两个 SCAN 地址或 VIP 地址直接拼在同一个 ADDRESS 里(比如用逗号分隔),这会导致解析失败或连接超时——Oracle 不支持这种写法。
-
ADDRESS_LIST必须包含至少两个独立的ADDRESS块,每个块对应一个 RAC 节点的监听地址(推荐使用 SCAN IP 或各节点 VIP) -
Load_Balance=true需放在ADDRESS_LIST外层,对整个地址列表生效 - 不要在
ADDRESS内部加Load_Balance,那是无效配置
连接字符串中 ADDRESS_LIST 的正确写法
Oracle Data Provider for .NET(ODP.NET)要求 ADDRESS_LIST 使用嵌套格式,且必须用括号包裹完整地址组。下面是一个可直接粘贴使用的最小可行示例:
DATA SOURCE=(DESCRIPTION=
(LOAD_BALANCE=on)
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=rac-scan.example.com)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=rac-node2.example.com)(PORT=1521))
)
(CONNECT_DATA=(SERVICE_NAME=orclpdb))
);USER ID=scott;PASSWORD=tiger;
注意:LOAD_BALANCE=on(不是 true 或 yes)是 Oracle 官方接受的值;ADDRESS 必须成对出现,不能少于两个;HOST 建议用 DNS 可解析的 SCAN 名称,避免硬编码 IP。
- 若用 ODP.NET Core(v3+),同样支持该语法,但需确认驱动版本 ≥ 19.10,旧版可能忽略
LOAD_BALANCE - Windows 上若 DNS 解析慢,会拖累首次连接,建议在
sqlnet.ora中设置NAMES.DIRECTORY_PATH=(TNSNAMES, EZCONNECT)并禁用 LDAP - 不要混用
ADDRESS_LIST和FAILOVER_MODE在同一连接串里调试——失败重试逻辑会干扰负载判断
为什么连上了还是总打到同一个节点?
现象:连接字符串配置无误,但 v$session 查到的 machine 或 host 字段始终显示同一个节点。这不是负载均衡失效,而是 Oracle 的“连接时分发、会话内不迁移”机制决定的。
关键点在于:负载均衡只在建立新连接时发生,已建立的会话不会跨节点转发 SQL 请求。所以如果你用连接池(.NET 默认开启),多数请求复用的是之前创建的连接,自然集中在某几个节点上。
- 验证是否真没分发:重启应用进程后观察前 10 次新连接的
SELECT host_name FROM v$instance结果 - 降低连接池复用率可加剧分发效果(不推荐生产使用):
Connection Lifetime=30(单位秒) - 更可靠的方式是结合 RAC 的服务名(Service Name)做服务端负载,比如用
DBMS_SERVICE.CREATE_SERVICE创建带CLB_GOAL=SHORT的服务,并在连接串中指定该服务名
ODP.NET 连接 RAC 时容易被忽略的兼容性细节
ODP.NET 的行为和 Oracle 客户端版本强相关,而 .NET 应用常忽略本地 Oracle 客户端的存在——尤其在容器化或 CI 环境中。
- 若用 ODP.NET Managed Driver(纯托管),
Load_Balance支持有限,仅适用于基本轮询,不支持基于响应时间的动态权重 - 若用 ODP.NET Unmanaged Driver,必须确保部署机器安装了匹配版本的 Oracle Client(如 19c client 对应 19c RAC),否则
ADDRESS_LIST可能被静默降级为单地址 - Linux 下需检查
LD_LIBRARY_PATH是否包含 Oracle client lib 路径,否则运行时报错System.DllNotFoundException: oci.dll(即使你没用 Unmanaged Driver,某些版本仍会尝试加载) - .NET 6+ 的单文件发布(Single-file publish)会破坏 ODP.NET 对本地 Oracle client 的路径探测,此时必须改用托管驱动或手动解压 native libs
真正起作用的从来不是某个开关,而是客户端驱动、网络配置、RAC 服务定义三者对齐后的协同结果。漏掉任意一环,Load_Balance=true 就只是个摆设。











