连接oracle时的socket read timeout或socketTimeout

1、问题描述:oracle可以连接成功,偶尔不可以或需要很长时间

在使用java连接oracle数据库(主要是oracle)时,可能会遇到一个奇怪的问题,就是偶尔可以执行,偶尔不可以,日中没有发现明显报错,且不能稳定复现,日志只有一个socket readtime timeout的错误打印出来

当这种问题出现后,尝试更改很多设置,并没有效果,可能是出现了tcp重传引发了一个更深层次的问题。

2、解决方案

2.1 原因分析

经过排查发现,此问题出现后,在不可用和可用的过程中,时间较为规律,比如最长是15分钟。并且没有其他报错,怀疑是网络连接问题

可能的原因:在客户端与数据库服务端,创建连接的过程中,在tcp握手后tls握手时,网络发生异常,导致创建连接的线程长时间卡在socketread0,无法创建新连接。导致整个连接池或连接不可用。

这种网络的异常可能是网络抖动或服务器宕机触发的tcp重传机制引发,由于客户端的操作系统tcp_retries2采用的默认值偏大,客户端最长需要924秒才能感知,双方建立的连接是无效连接

2.2 解决办法

linux操作系统的tcp_retries2默认值是15,调整该参数。

通过 /etc/sysctl.conf文件,设置 net.ipv4.tcp_retries2 为5

cat >> cat /etc/sysctl.conf << EOF
net.ipv4.tcp_retries2 = 5
EOF

sysclt -p

注:设置值之后,需要重启java服务 

2.3 复现的方式和参数值 

关于复现该问题的猜测,可以通过将数据库服务器直接屋里关机(不是重启和shutdown,而是直接拔掉电源),如果是虚机,用管理工具,将其电源关掉,这种方式可能能复现这个问题,但不建议过多次数使用

关于tcp_retries2参数,该参数不建议设置的太小,如果太小可能会造成频繁释放开启连接的新问题。对于绝大多数的网络环境,该参数设置为5或6都是可行的。设置为5,最多12秒就可以感知连接异常,设置为6,最多25秒感知连接异常。

在此提供一个表格:对应关系是tcp_retries2设置的值和感知需要的时长,需要错一位看,比如tcp_retries2为5,需要看6的那行

RetransmissionRTO(ms)time before a timeout
12000.2 secs0 mins
24000.6 secs0 mins
38001.4 secs0 mins
416003.0 secs0.1 mins
532006.2 secs0.1 mins
6640012.6 secs0.2 mins
71280025.4 secs0.4 mins
82560051.0 secs0.9 mins
951200102.2 secs1.7 mins
10102400204.6 secs3.4 mins
11120000324.6 secs5.4mins
12120000444.6 secs7.4mins
13120000564.6 secs9.4mins
14120000684.6 secs11.4mins
15120000804.6 secs13.4mins
16120000924.6 secs15.4mins

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南成旧巷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值