oracle 23c rac本地连接加速指jdbc thin驱动在客户端与rac节点同机时自动启用unix域套接字或命名管道通信,绕过tcp/ip栈以降低延迟;需ojdbc8+、scan地址解析为本机ip且无干扰配置(如sqlnet.ora缺失、oracle.net.disablelocalipc=true等)才生效。

Oracle 23c RAC 的本地连接加速到底指什么
它不是独立功能,而是 Oracle 客户端(尤其是 JDBC Thin)在满足特定条件时自动启用的底层优化行为:当客户端与 RAC 某个节点部署在同一台物理主机或同一虚拟机内时,驱动会绕过 TCP/IP 协议栈,改用 Unix Domain Socket(Linux)或 Named Pipe(Windows)进行进程间通信。这能显著降低连接建立延迟和小包往返开销,对高频短事务(如风控规则查表、缓存预热)效果明显。
关键前提是「本地性」必须被准确识别——ojdbc8 及更高版本才支持该逻辑,且仅在连接串明确指向本机 SCAN 地址(如 rac-scan1.example.com)并成功解析为 127.0.0.1 或本机真实 IP 时触发。如果 DNS 返回的是远端 IP,或使用了 localhost / 127.0.0.1 直连方式,则不会走此路径,反而可能因 bypass 了 SCAN 负载均衡而失去高可用保障。
如何确认本地连接加速是否生效
不能只看连接是否成功;要验证底层通信是否真的走了本地通道。最直接的方法是抓包 + 查日志:
- 在应用服务器上运行
ss -tulnp | grep :1521,若看到监听进程绑定的是127.0.0.1:1521或unix:类型 socket(非tcp),说明服务端已启用本地监听 - 启动 Java 应用时添加 JVM 参数:
-Doracle.jdbc.logLevel=2,然后检查日志中是否出现类似Using local IPC connection或Connecting via local domain socket的提示 - 用
strace -e trace=connect,socket,bind -p $(pgrep -f "java.*YourApp")观察系统调用,若看到socket(AF_UNIX, ...)和connect(..., {sa_family=AF_UNIX, ...}),即为本地加速已启用 - 对比相同 SQL 在本地加速开启/关闭下的
netstat -s | grep -i "segments retransmitted",本地模式下重传应趋近于 0
哪些配置会让本地加速静默失效
常见陷阱不是“没开”,而是“开了但被覆盖”。以下情况会导致驱动退回到标准 TCP 连接:
-
TNS_ADMIN目录下缺失sqlnet.ora,或其中未设置SQLNET.AUTHENTICATION_SERVICES=(NONE)—— 某些认证插件会强制走完整网络栈 - JDBC URL 中显式指定
protocol=tcp,或包含enableBundledDriver=true(该参数在 23c 中已弃用,但旧配置残留仍可能干扰) - DNS 解析结果不稳定:
rac-scan1.example.com有时返回本机 IP,有时返回集群其他节点 IP —— 加速只在「稳定本地解析」下工作 - 使用了 HikariCP 等连接池,并设置了
connection-test-query=SELECT 1,而该语句在本地 IPC 模式下因权限或上下文限制失败,导致连接被丢弃 - Oracle 23c 引入了
oracle.net.disableLocalIPC系统属性,默认为false,但若被显式设为true(例如在 Spring Boot 的application.properties中通过spring.jmx.enabled=false误触发全局 JVM 属性覆盖),则强制禁用
生产环境要不要主动启用本地连接加速
要看你的部署模型。如果是典型的「应用与数据库混部」(比如 Compute Cloud@Customer 上同 rack 内部署 Web 层和 RAC 节点),且业务对 p99 延迟极度敏感(
最容易被忽略的一点是:本地加速不改变 RAC 的服务名路由逻辑。即使走的是本地 socket,CONNECT_DATA 中的 SERVICE_NAME 仍由 SCAN 解析后的实例决定,所以你仍需确保该实例处于 ONLINE 状态,且服务未被手动停用(srvctl stop service)。否则连接会失败,而不是自动 fallback 到其他节点 —— 因为本地 IPC 不具备跨节点重定向能力。











