今天在运行服务器的时候发现一个问题,问题的表现是客户端一直在请求,但是返回给客户端的信息是异常,服务端压根没有收到请求,查看了一下配置信息没有错误,首先查看了一下是不是服务器的连接已经满了,打开netstat命令发现服务器的连接有大量的CLOSE_WAIT状态的socket,没怎么遇到这个问题,开始还真有段懵了,第一反应就是是不是客户端的问题(是不是出问题的第一反应都是别人的问题),但是马上补充了一下socket状态机的知识,发现这个状态是由于客户端关闭了socket连接,发送了FIN报文,服务端也发送了ACK报文,此时客户端处于FIN_WAIT_2状态,服务端处于CLOSE_WAIT状态,如下图:

可以看出,出现问题的原因是由于我这边没有发送第二个FIN报文导致的,分明是我的问题啊,为什么服务器没有发送FIN报文呢?我的服务器使用的是嵌入式的jetty,连接管理应该都是它帮我管理的,重启了一下服务器发现服务器的CLOSE_WAIT开始的时候没有出现,之后逐渐的上升,貌似随着请求的数量逐渐增长的,而我这边的日志也非常奇怪,我会在收到请求的时候打印日志,然后在执行完毕的时候输出一个accesslog信息,发现日志中有入口的请求日志,但是accessLog没有增长,于是单步调试了一下,发现了问题:一个servlet的执行走到主流程就走不下去了,阻塞在数据库访问那一步上,具体表现就是获取不到数据库连接!
     查看了一下代码,发现原来是自己创建连接,执行sql,完成之后没有关闭连接,OMG,这么愚蠢的错误,于是在所有的数据库操作的最后加上如下的代码:
     finally {
          DbUtils.closeQuietly(conn);
     }

好了,既然问题能够解决了,现在回头来思考一下问题产生的具体步骤:首先,我这边的大部分请求都需要查询数据库,我的数据库连接池设置的最大连接数是100,所以每一个请求创建了一个连接,等到100个请求就把连接池占满了,但是处理servlet的那个线程并没有释放这个连接,于是接下来的请求再去创建数据库连接的时候就会一直阻塞在那里,这里我所用的是DBCP作为连接池的,它的实现好像是使用apache的objectPool来实现的,如果没有可用的连接对象会导致线程等待,好了,servlet由于得不到数据库连接而阻塞了,这个客户端的请求就一直等待,客户端使用httpclient设置了5s的请求超时时间,那么超时之后就会抛出异常,关闭连接,关闭连接导致客户端发送了FIN报文,我这边的TCP/IP返回了ACK报文,但是由于处理请求的线程还处于阻塞的状态,所以当前的连接状态时CLOSE_WAIT。

警示:
1、代码一定要规范,尤其是在写一些关于自愿申请的部分,一定要在写函数之前写上注释告诉自己别忘了释放资源。
2、数据库连接和访问要设置超时时间,这点避免阻塞。
3、服务器的线程数也需要设置,使得问题尽可能的出现。
---------------------

服务端大量CLOSE_WAIT问题的解决相关推荐

  1. TCP聊天文件服务器v2.2 - 服务端客户端套接字解决分包/粘包问题 - SocketQueue继承以及减少冗余

    TCP聊天+传输文件服务器服务器套接字v2.2 整个图当封面吧 所有版本记录: v1.0 : TCP聊天服务器套接字|PyQt5+socket(TCP端口映射+端口放行)+logging+Thread ...

  2. axios使用post请求服务端不能获取参数的解决方法

    项目中使用到axios作为ajax请求插件,用到post请求是常见的,诸如以下场景的一个普通的post请求: export function listManage(params) {     retu ...

  3. 魔坊APP项目-17-种植园,商城页面、服务端提供商品api,解决App打包编译以后的跨域限制、客户端获取商品列表并进行展示,集成Alipayplus模块完成支付

    种植园 一.商城页面 orchard.html,代码: <!DOCTYPE html> <html> <head><title>用户中心</tit ...

  4. HttpClient测试类请求端和服务端即可能出现乱码的解决

    junit HttpClient 请求端 代码: package com.taotao.httpclient;import java.util.ArrayList; import java.util. ...

  5. react-template 包含客户端,服务端渲染完整示例

    原文链接 React version 16.2 版本脚手架 包含客户端,服务端渲染完整示例,使用了最新的react,并实现version 16.2 最新的服务端渲染; 解决了一些之前的服务端渲染bug ...

  6. 文件上传案例——客户端和服务端套接字

    一.文件上传原理 文件上传下载就是反复的输入流和输出流的read和wirte方法(反复的内存和硬盘的交互): 二.实现 1.客户端实现: 2.服务端实现: 3.解决客户端和服务端两个程序在完成上传下载 ...

  7. go token验证_GitHub - goflyfox/gtoken: 基于gf框架的token插件,通过服务端验证方式实现token认证;...

    gtoken 介绍 基于GoFrame框架的token插件,通过服务端验证方式实现token认证:已完全可以支撑线上token认证,通过Redis支持集群模式:使用简单,大家可以放心使用: gtoke ...

  8. 浅谈游戏服务端开发-架构

    网络游戏程序分为客户端和服务端.客户端负责图形渲染.交互和一些简单校验处理,服务端负责业务逻辑处理.数据存储. 我们开发一个游戏demo,服务端程序可以是一个单线程的服务进程.它包含网络通信.业务逻辑 ...

  9. SSR 学习 - 传统服务端渲染 Web 应用、客户端渲染、同构渲染、优缺点和案例演示

    概述 随着前端技术栈和工具链的迭代成熟,前端工程化.模块化也已成为了当下的主流技术方案. 在这波前端技术浪潮中,涌现了诸如 React.Vue.Angular 等基于客户端渲染的前端框架. 这类框架所 ...

最新文章

  1. MindMotion MM32F3277 SoftI2C功能测试
  2. 【HDOJ】1150 Machine Schedule
  3. 工业级光纤收发器使用“避坑”指南
  4. leetcode917
  5. oracle 日期转换成毫秒数,ORACLE:毫秒与日期的相互转换,获取某天的信息
  6. 如何写出高质量的shell脚本---------值得注意的地方
  7. 定制Dynamics CRM标准导出功能:不能导出指定列的值
  8. Pr常见问题,pr素材脱机后该如何恢复?
  9. Windows系统下快速安装、配置Aira2,及图形界面配置、度盘、B站视频下载
  10. 微信小程序--图片Image几种mode 设置图片方法
  11. 最强的右键菜单工具:超级右键专业版 mac中文版
  12. 制作地图的那些事(四)——制图之地图调优
  13. 日记侠:微信最简单最轻松的赚钱模式
  14. 使用图片制作3D背景
  15. PSP 图形处理能力
  16. 读书笔记之基于龙芯的linux内核探索解析
  17. html5文字中加图片,5、手写HTML语言代码之《在文字中加条横线、插入图片》学习网页制作的心得体会...
  18. 在线短视频秒播优化之视频文件格式之MP4文件Moov box的位置
  19. 使用Gradle构建变体
  20. java实现加减乘除以及等式判断

热门文章

  1. linux该专接本还是工作_是该专接本还是直接工作?学历和经验哪个重要?
  2. ae saber插件_入门AE:影视特效中的黑洞是怎么做的?附带教程
  3. 集群(三)——haproxy+nginx搭建web集群
  4. Mysql数据库(四)——mysql索引相关知识
  5. clickhouse原理解析与应用实践_Hybrid App (混合应用) 技术全解析 方案原理篇
  6. Windows Server 笔记之远程桌面
  7. KEIL常见编译错误和警告解决方案汇总
  8. 计算机组成原理第三章视频,计算机组成原理 第3章 3.4 十进制转换二进制
  9. java jpa性能_[Java Performance] 数据库性能最佳实践 - JPA和读写优化
  10. python从零开始系列连载_技术 | Python从零开始系列连载(一)