我们在 Azure Windows VM 上运行 Oracle 19c 数据库。我们的配置如下:
- Azure Windows 虚拟机
- 标准 B4ms(4 vcpus,16 GiB 内存)
- “空闲超时”为 30 分钟(允许的最大值)的公共 IP 地址。
- 甲骨文数据库 19c
从 VM 运行时,不会断开“空闲 SQL 会话”,但从公共 IP 地址访问时,会在 30 分钟后断开“空闲 SQL 连接”。
ORA-03135: connection lost contact
我们希望我们的“空闲 SQL 连接”是持久的,这是我们迄今为止所尝试的:
- 将 sqlnet.ora 文件编辑如下(客户端和服务器):
SQLNET.EXPIRE_TIME = 1000000
SQLNET.INBOUND_CONNECT_TIMEOUT = 1000000
- 编辑 tnsnames.ora 文件如下(客户端和服务器):
(ENABLE=BROKEN)
目前我正在尝试实现 Oracle keep-alive 包,但我没有成功。
有什么方向或想法吗?谢谢
[更新]我找到了一个解决方案,这就是我为了修复它所做的:
- 将“sqlnet.ora”恢复正常(客户端和服务器)
- 在“tnsnames.ora”文件上配置(ENABLE=BROKEN)(仅在客户端上)
- 使用以下参数在 Regedit 上设置 TCP KeepAlive(仅在客户端)(https://docs.microsoft.com/en-us/sql/connect/jdbc/connecting-to-an-azure-sql-database?view =sql-server-ver15 )
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"KeepAliveTime"=dword:00007530
"KeepAliveInterval"=dword:000003e8
"TcpMaxDataRetransmissions"=dword:00000010
- 重启客户端
您需要在客户端机器上更改一两个内核可调参数。使 TCP keepalive (ENABLE=BROKEN) 有用。默认情况下,Linux 内核在 2 小时后发送第一个 TCP keepalive 探测:
Linux内核:
当将 keepavlive 时间和 keepalive 间隔设置为 5 秒(仅用于测试。30 秒对于 prod 来说应该绰绰有余),那么您应该在 TCP 转储中看到类似这样的内容: