SQL*Net连接超时由SQLNET.INBOUND_CONNECT_TIMEOUT(服务端认证超时)、SQLNET.SEND_TIMEOUT和SQLNET.RECV_TIMEOUT(客户端收发空闲超时)控制,三者独立生效;SQLNET.EXPIRE_TIME仅用于已连通连接的心跳探测,不影响建立阶段超时。
SQL*Net 连接超时由哪些参数控制?
oracle 客户端连接超时不是单一参数决定的,sqlnet.ora 中真正起作用的是三个独立配置项: sqlnet.inbound_connect_timeout(服务端强制断开未完成认证的连接)、sqlnet.send_timeout 和 sqlnet.recv_timeout(客户端收发数据空闲超时)。很多人只改 sqlnet.expire_time,但它只影响已建立连接的心跳检测,对“连不上”完全无效。
常见错误现象:ORA-12170: TNS:Connect timeout occurred,或客户端卡在 Connecting... 状态 60 秒后失败——这基本是 SQLNET.INBOUND_CONNECT_TIMEOUT 或网络层(如防火墙、负载均衡)拦截导致的。
-
SQLNET.INBOUND_CONNECT_TIMEOUT默认值通常是 60 秒,设为 0 表示禁用(不推荐),建议根据实际网络延迟设为 120–300 -
SQLNET.SEND_TIMEOUT和SQLNET.RECV_TIMEOUT默认不启用(即无限制),若启用需成对设置,且值不宜低于 30,否则可能误杀慢查询 - 这些参数只在客户端
sqlnet.ora生效(服务端也有同名参数,但作用域不同)
为什么改了 sqlnet.ora 还没生效?
Oracle 客户端加载 sqlnet.ora 有严格路径优先级:当前目录 → $ORACLE_HOME/network/admin → $TNS_ADMIN 指向目录。很多用户把文件放在错的地方,或者根本没配 $TNS_ADMIN,结果改了等于白改。
验证是否加载成功最直接的方法是加一条非法配置,比如写 INVALID.PARAM=1,然后运行 tnsping —— 如果报 TNS-03505: Failed to resolve name 以外的解析错误,说明文件被读到了。
- Windows 下注意路径分隔符是反斜杠,但
sqlnet.ora里必须用正斜杠或双反斜杠,单反斜杠会被忽略 - Linux/macOS 下文件权限必须是 644,且属主为运行客户端的用户,否则 Oracle 会静默跳过该文件
- Java 应用(如 JDBC)默认不读
sqlnet.ora,除非显式调用OracleDataSource.setConnectionProperties()设置oracle.net.CONNECT_TIMEOUT
SQLNET.EXPIRE_TIME 能解决连接超时吗?
不能。SQLNET.EXPIRE_TIME 的作用是让服务端定期向已建立的连接发送探测包,用来清理意外中断(如客户端崩溃、网络闪断)后残留的“僵尸连接”。它对连接建立阶段的超时毫无影响,反而可能加重数据库负担。
典型误用场景:应用报 “connection reset by peer” 后,管理员以为是连接太久没活动,于是把 SQLNET.EXPIRE_TIME=10 加进去——结果发现新连接更不稳定,因为探测包在高延迟链路上频繁触发重传,反而干扰正常握手。
- 该参数仅适用于长连接池(如 WebLogic 数据源),且值建议 ≥ 30 分钟,避免频繁探测
- 如果真实问题是中间设备(如 F5、iptables)主动回收空闲连接,应优先调整设备侧的 idle timeout,而非依赖
EXPIRE_TIME - 开启后可通过
v$session查看last_call_et变化,确认探测是否生效
Java/JDBC 场景下如何绕过 sqlnet.ora 限制?
JDBC Thin 驱动不走 Oracle Net 栈,所以 sqlnet.ora 对它完全无效。连接超时由 JDBC URL 参数或驱动属性控制,和客户端配置文件无关。
最容易踩的坑是混用两种超时:URL 里的 connect_timeout 控制 TCP 握手阶段,而 socketTimeout 控制后续 SQL 执行阶段。两者必须分开设,且单位都是毫秒。
- 正确写法:
jdbc:oracle:thin:@//host:1521/orcl?connect_timeout=30000&socketTimeout=60000 - 旧版驱动(12.1 之前)不支持 URL 参数,必须用
Properties对象传:props.setProperty("oracle.net.CONNECT_TIMEOUT", "30000") - Spring Boot 用户注意:
spring.datasource.hikari.connection-timeout是连接池获取连接的等待时间,不是网络连接超时,别把它和 Oracle 层超时混淆
网络不稳定时,光调参数不够;真正关键的是确认 tnsping 能通、telnet host 1521 不丢包、服务端监听状态正常(lsnrctl status),再谈调参。否则所有修改都只是在掩盖底层连通性问题。










