LOAD_BALANCE=on必须置于DESCRIPTION块内且紧邻ADDRESS,不可放在CONNECT_DATA或DESCRIPTION_LIST外层;Server-side需REMOTE_LISTENER指向SCAN并执行ALTER SYSTEM REGISTER使PMON上报负载,缺一则连接全打首节点。

LOAD_BALANCE=on 必须放在 DESCRIPTION 内部,不是 CONNECT_DATA 里
很多人把 LOAD_BALANCE=on 错误地写在 CONNECT_DATA 块里,或者塞进顶层 DESCRIPTION_LIST,结果配置完全不生效。TNS 解析器只在每个独立的 DESCRIPTION 块里读取这个参数——它必须紧邻 ADDRESS,且在同一层级。
常见错误写法:
(DESCRIPTION_LIST =
(LOAD_BALANCE = on) ← 无效!这里不解析
(DESCRIPTION =
(ADDRESS = (PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))
(CONNECT_DATA = (SERVICE_NAME=mydb)
(LOAD_BALANCE = on) ← 无效!在 CONNECT_DATA 里被忽略
)
)
)
正确做法是每个 DESCRIPTION 单独配,且 LOAD_BALANCE=on 和 ADDRESS 并列:
- 用
DESCRIPTION_LIST包裹多个DESCRIPTION - 每个
DESCRIPTION都含一个ADDRESS和一个同级的LOAD_BALANCE=on - 不要在
CONNECT_DATA或外层DESCRIPTION_LIST中尝试设置
Server-side 负载依赖 REMOTE_LISTENER + PMON 主动注册
客户端随机选地址只是第一步;真正决定连接落到哪个实例的,是 SCAN Listener 是否掌握各节点实时负载。这靠两件事:每个实例的 REMOTE_LISTENER 必须指向 SCAN 地址(如 scan.example.com:1521),且 PMON 必须持续上报负载数据。
检查是否生效:
- 运行
srvctl config listener确认 SCAN 监听器存在 - 执行
lsnrctl status LISTENER_SCAN1,输出中需看到类似service_handler="DEDICATED", load=12的字段;没有load=表示注册失败 -
ALTER SYSTEM REGISTER;必须立即执行——否则 PMON 不会立刻推送新负载,可能延迟数分钟 - 若用了 GNS,
REMOTE_LISTENER必须指向 GNS VIP,指向 localhost 或单个 VIP 会导致静默失败
Java 应用走 thin driver 时,tnsnames.ora 配置仍起作用
哪怕你用的是 jdbc:oracle:thin:@... URL 格式,只要没显式禁用本地命名解析(比如没加 oracle.net.disableOcm=true),JDBC 仍会读取本地 tnsnames.ora 并按其中规则解析。你在 URL 里加 load_balance=true 或其他 LB 参数,一律被忽略。
所以 Java 应用要启用负载均衡,必须:
- 确保
tnsnames.ora文件存在且路径正确(默认在$ORACLE_HOME/network/admin或由TNS_ADMIN环境变量指定) - 使用服务名(
SERVICE_NAME)而非实例名(INSTANCE_NAME)连接 - 避免在 JDBC URL 中重复或覆盖 TNS 配置项——它不识别那些参数
只配 client-side 或只配 server-side 都等于没配
Oracle RAC 连接负载均衡是协同机制:client-side 决定“发给谁”,server-side 决定“谁来接”。缺任一环,所有连接大概率打到第一个节点。
典型失效场景:
- tnsnames.ora 里写了
LOAD_BALANCE=on,但REMOTE_LISTENER指向错误或未执行ALTER SYSTEM REGISTER→ 所有请求都由 SCAN Listener 转发到首节点 - server-side 注册正常,但客户端 tnsnames.ora 没用
DESCRIPTION_LIST包裹多个DESCRIPTION,或漏了LOAD_BALANCE=on→ 客户端永远只连第一个地址 - 用 UCP 或 OJDBC 时误以为驱动层能接管 LB,实际仍依赖底层 TNS 解析逻辑
最容易被忽略的是:PMON 上报负载有延迟,改完 REMOTE_LISTENER 后不手动触发 ALTER SYSTEM REGISTER,就去测试,结果看到的仍是旧负载分布。


















