首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java面试 >

某OA系统批改记录

2011-11-19 
某OA系统修改记录我们集团多年前上了一套OA系统,jsp+javabean+servlet,没有使用任何框架,model1。数据库:Sq

某OA系统修改记录
我们集团多年前上了一套OA系统,jsp   +   javabean   +   servlet,没有使用任何框架,model1。
数据库:SqlServer   2000
web服务器:Resin   2.1.6
开发者是合肥某家专业OA公司,应该是为我们定制的。具体情况我当时没有入职,不清楚。
从我第一天使用它就感觉很慢。近日发现经常死机,一天需要多次重启服务。2G内存,4CPU的服务器,经常cpu100%,全被sqlserver占用,db连动数动辄上千。


观察了一天,得出结论:要想彻底解决,只有辛苦一番了。
此次修改不涉及业务逻辑部分。
动手修改之后怒火却逐渐上升,好在凭借几十年的修身养性平息下来了,不过一天下来却得感冒,不知道是否跟这个有关。
笔录一些东西,感慨一番。或供大家批判、或引以为鉴。当年写程序的那个小伙子,如果你能看到,不知道有没有什么感慨呢?

   
(1)死机最主要原因出在数据库连接的管理上。

        数据库连接类(DBConnectionManager.java)。
        数据库操作类(DBQuery.java),在构造函数中取得DBConnectionManager的一个单例。
        该类特点是在方法executeQuery、executeUpdate之中,每次都从连接池中申请一个连接。
        DBQuery通过java   Bean使用,而在绝大部分jsp页面都包含:
<jsp:useBean   id= "dbquery "   class= "front.DBQuery "   scope= "page "/>
        也就是说打开一个页面,就产生一个Connection,观察到的sqlserver连接峰值3200+   ,即使是ORACLE,也很夸张。
        至于为什么这样,参考(2)。

        另外,还有一个函数返回值是ResultSet,但是在函数最后调用了freeConnection(),经常抛出“连接已关闭”错误也就不奇怪了。


(2)JSP页面中直接调用dbquery执行SQL查询。除少数正常关闭外,大部分ResultSet只管打开,不管关闭。正所谓:只管杀来不管埋!有魄力!
另外还有一部分是这样写的,我算他关闭了一半-_-!:
ResultSet   myrs2=dbquery.executeQuery( "xxxxxx ");
if(myrs2.next()){
myrs2.close();
}

有个地方还加了一个判断:
i   =   0;
while(rs.next()){
i   ++;
}
if(i   >   0)
rs.close();
这种……。


另附一个超强文件,文件名:whcqd_cc.jsp   (22k),只要一编辑,eclipse立即停止响应,cup   100%,无法解析文档结构图。只好结束进程,转到ultraedit中修改。
这个文件一部分代码如下:
  zuzhirs1   =   dbquery.executeQuery( "…… ");
//查找一级组织
        while(zuzhrs1.next()){
        zuzhirs2   =   dbquery.executeQuery( "…… ");
        //查找二级组织
        while(zuzhirs2.next()){
          ……
          //查找七级组织
          zuzhirs7   =   dbquery.executeQuery( "…… ");
        while(zuzhirs7.next()){
  ……
        }
        zuzhirs7.close();     //太震撼了,居然关闭了第七个rs
        }
       
        }
       
    7个zuzhirs中,关闭1/7。

(3)sql语句的优化,很少使用关联查询,最常见的是,需要用到时,随时打开一个游标查询(请考虑第一条、第二条),例如:
rs1   =   dbquery.executeQuery( "取用户信息 ");
while(rs1.next()){
String   yhh   =   rs1.getString( "yhh ");   //用户号
String   yhmc;
rstmp   =   dbquery.executeQuery( "select   名称   from   xxx   where   yhh   =   ' "   +   yhh   +   " ' ";
if(rstmp.next()){
yhmc   =   rstmp.getString( "名称 ");
}
……
//下一个类似的循环
}

某个大小45k的文件,名称:W_userdef_sqmodi.jsp,改完后我直接昏倒,清醒后不忘作了一个统计:
count(ResultSet)   ==   34
count(while)   ==   16


(4)超强的分页算法。
rs=dbquery.executeQuery( "select   xxx,   xxx   from   tablexxx     order   by   mail_date   desc ");
 
  i   =   (intPage-1)   *   intPageSize;


  for(j=0;j <i;j++)   rs.next();   //指向本页的第一条
 
  ……中间是近100行的无关代码
  while(rs.next()&&i <intPageSize){
  ……
  i++;
}

 
(5)关于Servlet中的一些写法:  
  大部分文件修改日期是2003.5,但是仍在使用session.putValue( " ",   " ")方法。
  在Servlet中,调用sendRedirect()之后,没有return,resin中经常抛这个错:
    Can 't   sendRedirect()   after   data   has   committed   to   the   client.
java.lang.IllegalStateException:   Can 't   sendRedirect()   after   data   has   committed   to   the   client.
这种错误危害较大,多了之后很容易宕机。另外,后台抛的NullException非常多,问题出在session超时检测上。

(6)
可能开发时,没有使用一个好的编辑器,jsp文件排版非常乱,缩进呈s型,前凸后翘的。全部业务逻辑都在JSP中,在多层循环嵌套情况下,读这种代码是一种考验。另外我还要修正一些html错误,包括标签不匹配、form位置、不规范的html写法等。

(7)命名
    db   object用汉语拼音我也认了,好在我汉字认的还挺多,即使少部分使用非普通话拼音命名的,我也能认出来。
    页面文件命名:wxx_gg_zbjl.jsp、wxx-gg-zbjl.jsp,没错,好几个文件长得很像,除了 "- "和 "_ "的区别。jsp文件命名字母大小写混杂。

(8)对系统的发布目录作了一下检查:
        WEB-INF\classes\front、WEB-INF\front,内容几乎相同(java、class都在一起,部分源文件丢失,只有class,无法正确反编译)
        前台页面也有重复:front、front\front,内容也几乎相同,本意是想作备份还是不太确定应该放在哪个目录?
   
   
   
   
   
最后想起了这家公司,据说在南京、上海都有发展……,找到它的网站:
“xx网络技术有限公司   成立于1998年2月,多年来始终致力于中国信息化事业的发展,作为国家认证的“双软”高新技术企业、信息产业部OA办公自动化软件行业标准起草单位、中国企业信息化标准工作组成员、中国电子政务标准测试和试用单位……”

上面还写着“中国领先的专业协同OA供应商”,真是与时俱进啊,已经到协同时代了!不知道和几年前相比,是否脱胎换骨?


从昨天到今天历时一天,明天放假好好休息,下周一继续修改。     可能会有最新感慨陆续更新……



[解决办法]
好好休息
[解决办法]
同情,花猫!
虽然我不太懂J2E,但是我也维护过这样的系统,只不过是用.Net开发的.
也是边改边发火.当时把开发的BS了N遍
[解决办法]
我靠。。。真TMD服了!!!

为什么都骂中国的软件行业? 就是被这样的SB公司给糟蹋了。

我日啊!

LZ保重。。。建议你不要做这个工作了。我两次的血的教训。
[解决办法]
"北京万户网络技术有限公司 ", 丢人啊。
[解决办法]
有意思,标记一下
一会仔细看...
[解决办法]
再次同情下樓主
[解决办法]
同情~~~~
[解决办法]
这个没法说,无论是开发公司,还是用户单位,都不规范不严格,所以说现在程序员队伍和开发公司都是鱼目混珠,全在个人的良心和标准.
[解决办法]
给当年那个程序员看又能怎样呢.说不定人家现在已经年薪几十W了.
我从业好几年的经历发现,越是能混且混的反而混得越好,越是追求完美非常较真的越是费力不得好.
水就是这样的混水,做鱼的,能活下来已经是造化了,哪还能奢望改造水环境了.
[解决办法]
:)
[解决办法]
jfjf
[解决办法]
刚刚全部看完,同情改程序的人,
[解决办法]
(6)
可能开发时,没有使用一个好的编辑器,jsp文件排版非常乱

可能tab键在不同编辑下解悉的空格数目不同造成的.
[解决办法]
呵呵。。。LZ很强。

如果是我,肯定不会做这样的工作了。

学不到什么东西,还容易被搞的郁闷。
------解决方案--------------------


这个东西怎么可能多年前就上了?可以运行到现在?

看来你们公司也用的不多,不然1小时重起几次很正常
[解决办法]
楼主,sqlserver最好指定它最大的使用内存,否则sqlserver2000的内存可涨到1.7G,而你机器的内存并不大。
[解决办法]
学习下----------
[解决办法]
典型的ASP转型Java,上海好多小公司如此!
[解决办法]
专程来接分
[解决办法]
其实这种情况多的去了,多数公司在还没发展起来的时候都这样,编码根本就没有规范,也根本谈不上什么设计了.纯粹的就是能把需要的功能表面上完成了就算完事
[解决办法]
恭喜楼主!

LZ也是经验丰富的老手了。改个系统都这么快。
[解决办法]
佩服。

热点排行