最近在检查公司平台的一个BUG,BUG的具体症状是:平台用户上传了一个附件,提交时需要等待30-50分钟,有时根本传不上去。
解决BUG:
1、我先检查了平台的日志,发现相关业务没有发生异常,检查了整个WEB服务器的日志,发现有很多"TNS:connection close"。接着我就怀疑是由于平台的链接池被耗尽,于是我就重新配置链接池,定期回收超时链接。
2、代码上线后,用户反应该问题还是存在,但是现在可以提交了,不会出现提交不上去。但是现在还是很慢速度并没有上去。并且运维同事反一旦用户提交后,系统的CPU负载会达到一个很可怕的数量级。于是我把该业务模块的所有代码拿出来一个个剖析跟踪。结果真发现了问题,即使在本地,提交一个10万行左右的文件,也很慢。。。
慢慢一行代码段出现在了我的面前具体如下:
while((fileLine = in.readLine()) != null) {
line_num++;
if(CTools.checkMobileValid(fileLine)!=0) {
text_error = "error";
send_hash.put(String.valueOf(hash_num), line_num + "_" + "您输入的手机号码无效!");
hash_num++;
}
else {
mobilenumber += fileLine + ",";
}
}
String[] mobilenumber_arry = mobilenumber .split(",");
mobilenumber += fileLine + ",";
String[] mobilenumber_arry = mobilenumber .split(",");
请注意代码中红色 字体部分,另外该循环大概有10万行。
看到上面的代码我很是郁闷....,这样的思路我是理解不了,也看不明白,贴一个字符串测试例子:
http://blog.youkuaiyun.com/chuan122345/archive/2007/08/12/1739806.aspx
通过这个例子,我们可以学习到字符串链接,有时候真会死机的。。。如果传一个20万行的文件,我将毫不怀疑会直接把服务器给挂死。。。(当然,这也取决于服务器的运算力。。。)