最近线上监控 SFTP 连接频繁爆表,通过重启某个系统,连接数迅速下降,系统就能恢复正常,初步判断是应用程序连接未关闭的问题导致的。

栈长通过 IDE 全局搜索排查,SFTP 连接使用了 jsch 包,确实有一些功能点使用了 SFTP 连接而未关闭的情况,或者不在 finally 语句块中正常关闭。

整改上线后,SFTP 还是爆表……

事后运维心态都要崩了,运维主动写了个 SFTP 连接监控,当连接超过 5 分钟空闲时就主动断开。

但这只是临时的处理,真正的原因肯定还是应用程序没有正常关闭导致的,于是再认真排查下程序,终于找出了元凶。。

下面是示例代码:

Session session = null;

ChannelSftp channel = null;

try{

for(...){

...

// 创建会话

JSch jsch = new JSch();

jsch.getSession(host, username);

session = jsch.getSession(username, host, port);

session.setPassword(password);

session.connect();

// 创建sftp连接

channel = session.openChannel("sftp");

channel.connect();

...

}

} catch(...){

...

} finally{

if (null != channel && channel.isConnected()) {

channel.disconnect();

}

if (null != session && session.isConnected()) {

session.disconnect();

}

}

大家都看出问题了吗?

这程序我检查了 2 遍,排查了 3 天才解决了这个问题。

写出这代码,同事真是个人才啊!!!

乍一看,连接确实是关闭了啊,也确实是在 finally 语句块关闭,为什么还会有问题?

原因就是在该死的 for 循环中创建连接的,虽然在 finally 中进行了关闭,但是连接变量在循环中进行重建和替换,所以关闭的永远只是最后一个连接。

而且,这还是个下载 Excel 明细的功能,数据很多的时候,一个操作就能导致连接瞬间爆表。

解决方案肯定是要把创建连接的部分拿到 for 循环前面去,连接创建一次就好了,可以反复使用。

另外,知道 JDK 7+ 中的 try-with-resources 语法的朋友可能会问,可以省略 finally 语句块吧,可以直接在 try(...) 中定义,它会自动关闭。

Really?建议还是仔细阅读下 try-with-resources 这篇文章吧,没看过的可以关注公众号Java技术栈进行搜索阅读。

这个 jsch 连接包还真不行,我们来看它的源码吧,不然又是一个坑你没商量的坑。

com.jcraft.jsch.Session:

com.jcraft.jsch.Channel:

这两个类只实现了 Runnable 接口,没有实现 java.lang.AutoCloseable 接口,所以,它并不符合 try-with-resources 自动关闭的原则。关于流关闭具体演进可以参考Java技术栈公众号 "简化流关闭新姿势" 这篇文章。

至此,线上 SFTP 连接爆表的问题终于解决了,可以安心睡个好觉了,同时,我也感觉我们的同事太牛逼了,又让我涨知识了。

大家引以为戒吧,也欢迎在看、转发!

关注公众号Java技术栈回复"面试"获取我整理的2020最全面试题及答案。

推荐去我的博客:

觉得不错,别忘了点赞+转发哦!

java怎么写隐藏bug_同事牛逼啊,写了个隐藏 bug,我排查了 3 天才解决问题!相关推荐

  1. mysql提权马免杀_WebShell-2/牛逼免杀提权隐藏大马.asp at master · SecWiki/WebShell-2 · GitHub...

    UserPass="admin"'密码 '------------------------请勿用于非法途径---------------------- mmname="牛 ...

  2. 腻害了!同事写了个隐藏 Bug,我排查了 3 天才解决问题!

    作者 | 栈长 来源  Java技术栈 最近线上监控 SFTP 连接频繁爆表,通过重启某个系统,连接数迅速下降,系统就能恢复正常,初步判断是应用程序连接未关闭的问题导致的. 栈长通过 IDE 全局搜索 ...

  3. 牛逼哄洪的 Java 8 Stream,性能也牛逼么?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 Java8的Stream API可以极大提高Java程序员的生产力 ...

  4. struts2前台获取setattribute为空指针异常_告诉你,这样设计 Java 异常更优雅,更牛逼!...

    来源:Lrwin lrwinx.github.io/2016/04/28/如何优雅的设计java异常/ 导语 异常处理是程序开发中必不可少操作之一,但如何正确优雅的对异常进行处理确是一门学问,笔者根据 ...

  5. 去携程实习了!半年时间,从机械转行 Java,二哥的读者真牛逼!

    大家好,我是二哥呀. 今天端午节,我带着老婆.女儿.妹妹来青岛了,高铁上,我们谈起了毕业后去哪里工作的话题.老读者应该知道了,我毕业后去的苏州,从个人情感上来说,我是非常喜欢苏州的,不仅景美,人也美, ...

  6. #为何程序员百万年薪,CTO技术总监架构师不写代码还这么牛逼 ?

    [此文章转自乐字节] 真的是一点不服气我的领导,每天就在座位上看看头条,到时间开开会,每天写代码的时间可能不到两小时,到底是为什么他的收入有年薪百万?我们都是985研究生毕业,是什么铸就了他的价值? ...

  7. 第一个Java程序Hello World(IG牛逼)

    像大多数初学者一样,了解Java的第一个程序就是输出字符串"Hello World!" 话不多说,上代码: 在这里插入代码片 public class HelloWorld{ pu ...

  8. 发现一款自学Java可视化工具神器,非常牛逼,太爱了!

    最近发现一款Java自学神器,超级牛逼,今天分享给大家. 介绍 Codegym 是一个以 Java 为中心的平台,它比其他平台上都要更加深入的介绍 Java,这个网站将理论和实践知识相结合,你可以在上 ...

  9. 花30天整理了11个超棒的Java开源项目,雀氏牛逼

    之前有粉丝让我推荐一些好的开源项目,所以上个月我几乎每天都会分享一个不错的项目,为了方便大家阅读,我今天把上个月发的项目都整理一下(真的不是为了水文啊!!) 这不是快秋招了嘛,所以这个月准备发一发面试 ...

最新文章

  1. MySQL中的共享锁与排他锁
  2. jetty 添加basic auth
  3. 开发一个用户喜欢的ABAP接口日志程序
  4. Linux下进度条小程序
  5. 你爱我吗? | 今日最佳
  6. java规定日期格式输出_Java格式化输出日期百分比时间等
  7. android8.0应用图标适配调整_怎样更换macOS Big Sur 应用图标
  8. 深夜不眠,爬起来写博客
  9. 51nod 1135 原根(原根)
  10. 偏相关分析MATLAB代码实现
  11. ubuntu重装显卡驱动
  12. 探索大型网站技术架构(二)
  13. opencv IplImage和Mat的 区别和转换
  14. 获取Linux服务器公网和内网IP地址
  15. salesforce chatter 调查的相关内容
  16. ios android与wp,在iOS与Android间选择WP
  17. HBuilder webApp开发(十)在线差异化升级
  18. ImageWatch无法显示图像
  19. 实现微信小程序与微信生态的互相跳转H5入口
  20. ACL2022 事件抽取

热门文章

  1. “官宣”:程序员被正式纳入新生代农民工!
  2. 进程和线程基础知识全家桶,30 张图一套带走
  3. Leader晋升失败,CTO说,没有商业敏感度,迟早被淘汰
  4. REST API安全认证研究!
  5. 【系统缓慢、CPU 100%、频繁Full GC问题】的定位排查思路!
  6. 5年以上的Java程序员,千万别忽略这一点
  7. 这10道Java面试题!95%的人回答不出来!
  8. 马斯克:SpaceX成功的背后,经历了18次失败、被骂是骗子、几近破产
  9. 值得推荐的8个超强工具,让你万事无忧!
  10. 团队不需要在计划会上考虑到所有事情