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:<server_type>://<server>[:<port>][/<database>][;<property>=<value>[;...]] | 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越大阻塞时间越长。
如果是httpclient也是一样的增加超时处理:
httpClient3.1只支持3种timeout的设置:
- connectionTimeout : socket建立链接的超时时间,Httpclient包中通过一个异步线程去创建socket链接,对应的超时控制。
- timeoutInMilliseconds : socket read数据的超时时间, socket.setSoTimeout(timeout);
- httpConnectionTimeout : 如果那个的是MultiThreadedHttpConnectionManager,对应的是从连接池获取链接的超时时间
HttpClient client = new HttpClient();
client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, CONNECTION_TIMEOUT);
client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, SO_TIMEOUT);
参考文章:
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
JDBC未设置socket超时导致应用程序的线程池阻塞相关推荐
- java jdbc超时设置_java – 为JDBC连接设置网络超时
我正在尝试使用 Java设置网络超时我的Oracle数据库连接.但是,我收到了一个错误.下面是示例代码,它是相应的例外. try{ conn = new Database("oracle&q ...
- oracle dg 备库未设置convert参数导致ORA-01111,ORA-01110
2019独角兽企业重金招聘Python工程师标准>>> 查看trace 文件: MRP0: Background Managed Standby Recovery process s ...
- 此流上不支持超时。_10分钟了解线程池,阿里再也不担心我线程池资源耗尽了...
线程池:避免了创建线程和销毁线程的资源损耗. Executors提供四种线程池: newCachedThreadPool :缓存线程池,如果线程池长度超过处理需要,可回收空闲线程,若无可回收,则新建线 ...
- java socket 线程池_java socket编程的一个例子(线程池)
服务器程序EchoServer.java: import java.io.*; import java.net.*; import java.util.concurrent.*; public cla ...
- URLConnection 网络超时不返回,未设置自动超时
最近在使用URLConnection conn = realUrl.openConnection(); 时 没有设置 conn.setConnectTimeout(30000); conn.setR ...
- @JsonFormat注解未设置时区导致的返回时间错误
@JsonFormat未设置时区而导致返回错误时间 有时候我们使用 @JsonFormat注解时会忽略设置时区,这样有可能就会导致我们转换的时间与我们从数据库查出的真确时间有差别 这样有可能会导致时间 ...
- 《C#多线程编程实战(原书第2版)》——3.6 在线程池中使用等待事件处理器及超时...
本节书摘来自华章出版社<C#多线程编程实战(原书第2版)>一书中的第3章,第3.6节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问 ...
- 线程池的创建及参数设置详解
一. 常见线程池 线程池的创建方法主要有两类,第一是通过Executors 创建线程池,第二是通过 ThreadPoolExecutor 创建线程池. 首先我们来看通过Executors 创建的线程池 ...
- netty socket超时设置_彻底搞懂 netty 线程模型
编者注:Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo.Rocketmq.Hadoop等.本文就netty线程模型展开 ...
最新文章
- iframe子页面操作父页面
- CF912D Fishes 期望
- Android创建自己的gradle依赖包
- Apache Kafka-SpringBoot整合Kafka发送复杂对象
- 简单的实现微信获取openid
- Android控件第6类——杂项控件
- [Python]网络爬虫(十):一个爬虫的诞生全过程(以山东大学绩点运算为例)
- 网信办:2021年全国受理网络违法和不良信息举报1.66亿件
- 转:CDC,CPaintDC,CClientDC,CWindowDC区别
- SpringMCV结构
- 利用【监听器】动态加载Log4j配置文件
- 三菱PLC软件有LINUX版本吗,三菱PLC编程软件(GX Developer)
- 网络编程基础(Socket ServerSocket)
- seo整站优化到底该从哪些方面进行着手(干货分享)
- 纯CSS实现3D旋转相册特效
- 支导线手工和电脑怎么计算方位角并推算坐标
- oracle 磁带备份,磁带备份 - Linux下实现自动备份Oracle数据库_数据库技术_Linux公社-Linux系统门户网站...
- android远程控制win10,微软推出适用于Win10专业版的Android远程控制
- 红米note7找android,红米 NOTE7 PRO简易测评与去广告
- 我为什么没有成为华为元老,谈精准学习,避免低水平勤奋
热门文章
- 【白皮书分享】人工智能治理白皮书.pdf(附下载链接)
- http抓包实战 pdf_抓包实战 | 浏览器里的HTTP请求到底是如何完成的?
- python通配符搜索文件_Python 如何查找特定类型文件
- 删除mysql临时文件_mysql自动备份数据库与自动删除临时文件
- Leetcode每日一题:23.merge-k-sorted-lists(合并K个排序链表)
- 【leetcode】1023. Camelcase Matching
- 计算机开放电子书归档 2018
- Android NDK开发:打包so库及jar包供他人使用
- 【十五】Jmeter:“CSV 数据文件设置”参数化请求中出现带有空格的参数值
- 管理学生信息android,Android 学生信息管理系统-Go语言中文社区