JDBC未设置socket超时导致应用程序的线程池阻塞

应用阻塞,查看堆栈发现线程阻塞在线程池的同步方法上,而进入同步方法的线程在等待socket读。

推测为网络问题导致的连接阻塞,但应用未设置socket超时而一直等待。网上说JDBC通过socket实现,无法主动探知网络错误,而socket通过TCP/IP实现应用也无法主动发现数据库连接断开。如果没有设置socket timeout的话,应用在数据库返回结果前会无期限地等下去,这种连接被称为dead connection。为了避免dead connections,socket必须要有超时配置。socket timeout可以通过JDBC的api设置也可在操作系统设置。套接字底层是基于TCP的,所以socket的超时和TCP超时是相同的。

为了防止下次出现这种情况设置了JDBC的socket连接超时socketTimeout

不同驱动的socketTimeout配置项

JDBC Driver connectTimeout配置项 socketTimeout配置项 url格式 示例
MySQL Driver connectTimeout(默认值:0,单位:ms) socketTimeout(默认值:0,单位:ms) jdbc:mysql://[host:port],[host:port]…/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]… jdbc:mysql://xxx.xx.xxx.xxx:3306/database?connectTimeout=60000&socketTimeout=60000
MS-SQL DriverjTDS Driver loginTimeout(默认值:0,单位:s) socketTimeout(默认值:0,单位:s) jdbc:jtds:://[:][/][;=[;...]] jdbc:jtds:sqlserver://server:port/database;loginTimeout=60;socketTimeout=60
Oracle Thin Driver oracle.net.CONNECT_TIMEOUT (默认值:0,单位:ms) oracle.jdbc.ReadTimeout(默认值:0,单位:ms) 不支持 通过url配置,只能通过OracleDatasource.setConnectionProperties() API设置,使用DBCP时可以调用BasicDatasource.setConnectionProperties()或 BasicDatasource.addConnectionProperties()进行设置
CUBRID Thin Driver 无独立配置项(默认值:5,000,单位:ms) 无独立配置项(默认值:5,000,单位:ms)

看网上说必须设置socket超时,设置connect超时不生效,因为socket更底层一些,需要通过JDBC的api设置。如图显示socket超时的设置

附:TCP的三次握手和四次挥手

vi /etc/sysctl.conf 修改

net.ipv4.tcp_syn_retries参数

该参数同样可以在/proc/sys/net/ipv4/tcp_syn_retries进行设置.

net.ipv4.tcp_syn_retries参数是tcp的syn最大重发次数。tcp建立连接的过程从客户端发送syn包开始。如果客户端没有收到这个syn包的回复,内核会重试多次发送syn包,每次重试的间隔都会逐渐增加,避免发送太多的syn包影响网络。tcp_syn_retries越大阻塞时间越长。

参考文章:

https://www.jianshu.com/p/2deaf51bf715

https://blog.csdn.net/san_yun/article/details/84447334

https://blog.csdn.net/sinat_17736151/article/details/82804404

https://blog.csdn.net/largetalk/article/details/16863689

http://willbryant.net/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout

https://blog.csdn.net/profesir/article/details/52534390

https://www.cnblogs.com/whuqin/p/5580895.html

https://blog.csdn.net/jiaomingliang/article/details/45950591