论坛首页 Java企业应用论坛

10万个字符串相加会发生什么??

浏览 19334 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (7) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-29   最后修改:2010-01-29

最近在检查公司平台的一个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.csdn.net/chuan122345/archive/2007/08/12/1739806.aspx

 

通过这个例子,我们可以学习到字符串链接,有时候真会死机的。。。如果传一个20万行的文件,我将毫不怀疑会直接把服务器给挂死。。。(当然,这也取决于服务器的运算力。。。)

 

   发表时间:2010-01-30  
楼主应该学习了解一下String的类型,这样的频繁拼接应该用StringBuffer
0 请登录后投票
   发表时间:2010-01-30  
mengke 写道
楼主应该学习了解一下String的类型,这样的频繁拼接应该用StringBuffer

楼主的描述似乎表明这段代码并不是楼主自己写的,而是楼主接手维护的。这种状况让人同情……
而且原本那段代码要表达的意图大概是这样:
List<String> mobilenumber = new ArrayList<String>();
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.add(fileLine);
  }
}
String[] mobilenumber_arry = mobilenumber.toArray(new String[mobilenumber.size()]);

楼主显然也知道这点……只是提醒一下大家说别像顶楼代码那样乱搞而已,吧?
0 请登录后投票
   发表时间:2010-01-30  
最好是用StringBuilder,非线程安全的
0 请登录后投票
   发表时间:2010-01-30  
同意楼上这位,用stringbuilder更好
0 请登录后投票
   发表时间:2010-01-30   最后修改:2010-01-30
是的,string类型的字符串相加会很慢,有次我读了一个文件,我因为死机了呢,
原来是拼串特别慢。不过我的数量级没有你那么大,最后结果还是出来了。
0 请登录后投票
   发表时间:2010-01-30  
我也赞同用StringBuffer
0 请登录后投票
   发表时间:2010-01-30  
Effective java中也有一个这样经典的案例。就是字符串相加。StringBuilder是JDK1.5出来的,用意是替换以前的StringBuffer 比StringBuffer操作效率更高
0 请登录后投票
   发表时间:2010-01-30  
append太多了会溢出。
我的意思是 buffer append太多,在很久以前这件事在我面前发生了
0 请登录后投票
   发表时间:2010-01-30  
RednaxelaFX 的回复才是正途!
为什么要拼接起来后再拆分呢?如果不担心OOM,不能直接放入一个List,后面直接使用吗?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics