TCP keepalive未生效导致连接空闲几分钟断开,因系统默认tcp_keepalive_time为7200秒,远超中间设备(如防火墙、SLB)5~15分钟超时阈值,需从JDBC驱动参数(如&tcpKeepAlive=true)和操作系统级参数(如sysctl调小keepalive_time/intvl/probes)双路径配置。

连接空闲几分钟就断开?先确认是不是TCP keepalive没起作用
DBeaver 本身不实现心跳包,它依赖 JDBC 驱动和底层 TCP 协议的 SO_KEEPALIVE 行为。很多用户反馈“查着查着连接就断了”,实际是操作系统默认的 tcp_keepalive_time(7200 秒)太长,中间网络设备(比如企业防火墙、云厂商 SLB)在 5~15 分钟无流量后主动踢掉连接,而 DBeaver 还浑然不知。这时候光调 DBeaver 设置没用,得从驱动参数和系统级 keepalive 两个层面入手。
JDBC URL 里加 keepAlive 参数(对 MySQL/PostgreSQL/达梦等有效)
不是所有驱动都支持,但主流数据库的较新 JDBC 驱动已提供应用层保活开关。关键是要写进连接 URL,而不是只靠 DBeaver 界面里的“超时”设置:
- MySQL:在连接字符串末尾加
&tcpKeepAlive=true&socketTimeout=300000(socketTimeout控制单次读超时,非保活) - PostgreSQL:用
?keepAlive=true&tcpKeepAlive=true - 达梦:驱动
DmJdbcDriver18.jar支持keepAlive=true,URL 示例:jdbc:dm://192.168.1.100:5236/SYSDBA?keepAlive=true - Oracle:不原生支持 keepAlive 参数,得靠
oracle.net.CONNECT_TIMEOUT+oracle.net.RECV_TIMEOUT配合连接池重试逻辑
⚠️ 注意:keepAlive=true 是触发驱动层定时发空包,但具体间隔仍受 OS 内核参数约束,不能替代系统级配置。
DBeaver 连接设置里必须关掉“自动提交”和“连接超时”的误导项
很多人在 Connection settings → Initialization 里勾选了 Auto-commit,以为能“保持活跃”,其实完全无关——那是事务控制开关。真正影响连接存活的是下面这两处:
-
Connection timeout:只控制建连阶段等待时间,连上了就失效 -
Query timeout:只限制单条 SQL 执行时长,跟空闲断连无关 - ✅ 正确做法:进
Connection settings → Driver properties,手动添加键值对,如keepAlive=true(部分驱动认这个)或socketTimeout=300000
如果驱动不识别这些 key,DBeaver 会静默忽略,不会报错——这也是最容易被忽略的坑。
终极兜底:改操作系统 keepalive 参数(Linux/macOS 必做)
当 JDBC 层保活不可控(比如老版本驱动),或者你管理多台客户端机器,统一策略更可靠:
- Linux:临时生效(重启失效):
sudo sysctl -w net.ipv4.tcp_keepalive_time=600 net.ipv4.tcp_keepalive_intvl=60 net.ipv4.tcp_keepalive_probes=3 - macOS:
sudo sysctl -w net.inet.tcp.keepidle=600000 net.inet.tcp.keepintvl=60000 net.inet.tcp.keepcnt=3(单位是毫秒) - Windows:注册表路径
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,新增DWORD值:KeepAliveTime(毫秒)、KeepAliveInterval、MaxDataRetries
改完不用重启 DBeaver,新建立的连接立即生效。但要注意:这是全局系统行为,会影响所有 TCP 连接,别设得太激进(比如 keepalive_time 小于 300 秒),否则可能干扰 SSH、HTTP 长连接等其他服务。











