应用阻塞,查看堆栈发现线程阻塞在线程池的同步方法上,而进入同步方法的线程在等待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