|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
到时我们不用学struts,不用学spring,不用学Hibernate,只要能把jsf学会了,完全可以替代所有的框架,包括AJAX,都知道AJAX并不是新技术,虽说我没深入学习jsf但我认为jsf应该已经能通过其它技术替代AJAX,实现无缝刷新。功能在开辟www.jobcn.com的时代,体系在运转的时分呈现了一些成绩,现将我的成绩办理办法做一个小结,供今后作项目标参考。并请人人不吝珠玉.
成绩1:
Resin的数据库毗连数量在程序运转中不休增加,最初毗连数量凌驾最年夜数,招致Resin服务封闭
缘故原由:
在操纵完数据库后,没有封闭数据库毗连;大概是前往了局集(Resultset),而没法在jsp中封闭数据库毗连。
办理办法:
1.在操纵完数据库要封闭数据库毗连。
2.只管不要前往了局集Resultset,能够前往Vector(一个字段)、Hashtable(多个字段),如许能够在javabean中封闭数据库。
3.假如javabean中前往的是了局集(Resultset),也能够在javaBean中写一个connectDB(毗连数据库)、closeDB(封闭数据库)的办法,然后jsp内里挪用connectDB(),创建数据库毗连,同时就能够对数据库举行操纵了,操纵数据库终了,能够经由过程closeDB()来封闭数据库。
4.封闭毗连时只管利用conn.close(),rs.close().....而不要别的写办法往封闭它,如挪用DB.closeConnection(conn)等等,如许实在对功能有必定影响,由于该功能经由了我对单个文件的测试.
5.封闭毗连时请按按次举行,如rs.close()..,stmt.close()..conn.close()....
成绩2:
在运转某一个jsp程序的时分,Resin的内存蓦地增加,并且居高不下。终极招致Resin内存不敷,乃至当机。
缘故原由:
过分利用内存。
办理办法:
1.因为数据量对照年夜,在对字符串举行操纵的时分,利用+举行字符串联接,而
信任人人对String都十分熟习,我们也常常要用它来做字符串的毗连甚么的,比方:
Stringa=b+cfile://b,c都是String
可是在实践的编译中倒是如许:
Stringa=newStringBuffer().append(b).append(c).toString()明显,在一个复杂的语句中却不测的多天生了2个对象:
.StringBuffer()
.toString前往的一个String
我们对照一下这两段程序的功能:
程序片段一:
StringBuffers=newStringBuffer();
longstart=System.currentTimeMillis();
for(inti=0;i<10000;i++){
s1+="a";
}
longstop=System.currentTimeMillis();
System.out.println(stop-start);
程序片段二:
StringBuffers=newStringBuffer(10000);//
longstart=System.currentTimeMillis();
for(inti=0;i<10000;i++){
s.append("a");
}
longstop=System.currentTimeMillis();
System.out.println(stop-start);
对照一下了局,差异很分明。
至于为何String的毗连这么做,由于String没法间接改动其长度,而必需接纳StringBuffer的用法。
因而倡议利用StringBuffer的append办法来举行字符串相连。
2.在办理这个成绩的时分,我也实验利用下面的办法,效果并非很分明(损耗内存上)。厥后在显现大批数据的时分,制止字符串相连的步骤,而间接利用out.println(),间接输入。
成绩3:Java其实不制止程序占用过量的内存,当对象向堆所哀求的内存不敷时,渣滓搜集器(GarbageCollector)就会主动启动,开释那些援用数为零的对象所占用的内存,Java也不会主动开释无用的对象的援用,假如程序健忘开释指向对象的援用,则程序运转时的内存跟着工夫的推移而增添,产生所谓内存泄露(memoryleaks),创立对象不仅损耗CPU的工夫和内存,同时,为开释对象内存JVM需一直地启动渣滓搜集器(GarbageCollector),这也会损耗大批的CPU工夫。
办理办法:因为在运转一段工夫jsp程序后,Resin的内存会有一个迟缓的增加,如许也会招致内存溢出,为了不这总征象的呈现,终极的办理办法是:编写一个servlet程序,在启动服务器的时分,启动一个这个servlet,每隔20分钟运转在服务器端运转一次,来准时接纳内存。
成绩4:
log文件内里的调试信息没有正文往失落。
办理办法:
在程序经由过程后,只管把调试的信息正文往失落。
同时在捕获毛病的时分要写明程序称号,便利查找.
成绩5
改良功能,进步速率。
详细实例:
我们再来看一个有关Vector类的代码片断:
for(intI=0;I<v.size();I++){System.out.println(v.get(I).getClass().toString());}
假如v包括100,000个元素,这个代码片断将挪用v.size()办法100,000次。固然size办法是一个复杂的办法,但它仍然必要一次办法挪用的开支,最少JVM必要为它设置和扫除仓库情况。在这里,for轮回外部的代码不会以任何体例修正Vector范例对象v的巨细,因而下面的代码最好改写成上面这类情势:
intsize=v.size();for(intI=0;I<size;I++){System.out.println(v.get(I).getClass().toString());}
固然这是一个复杂的修改,但它仍然博得了功能。究竟,每个CPU周期都是可贵的。
成绩6:
在jsp文件内里不要写<%@pageimport="java.lang.*"%>
由于java不必要引进此包就能够援用内里的类文件。
成绩7:
利用vector+hashtable一次前往查询了局resulset.
办理办法:纪录集:将一笔记录放到一个hashtable内里,然后把它再
增加到vector内里,轮回纪录下了局集,前往vector
详细见前面的java文件的部分代码(不包扩数据库的毗连和封闭)
packagecom.jobcn.company;
/********************************************
*****申明:
*****纪录集:一笔记任命放到一个hashtable内里,然后把它再
放到vector内里,轮回纪录下了局集,前往vector
*********************************************/
importjava.io.*;
importjava.sql.*;
importjava.util.*;
importjava.text.*;
publicclasshashtable_vector_rs
{
/*----------------------------------------------------------------*/
/*函数称号:getMultiRowInfo
/*功效形貌:前往纪录集,放到Hashtable内里
/*参数:sql语句,字段个数
/*前往值:乐成---htable,失利---null
/*----------------------------------------------------------------*/
publicVectorListResult(StringsqlStatement,intnum)
{
VectorListRs=newVector();
try
{
connectDB();
rs=stmt.executeQuery(sqlStatement);
//判别字段数据范例
//date型前往93
//int型前往2,4
//bigint型前往3
//String型前往12
//(char型)前往1
intt=-1;
rsmd=rs.getMetaData();
intColumnCount=0;
if(num>0)
ColumnCount=num;
else
ColumnCount=rsmd.getColumnCount();
while(rs.next())
{
Hashtablehtable=newHashtable();
for(inti=1;i<=ColumnCount;i++)
{
t=rsmd.getColumnType(i);
System.out.println("i="+i+",t="+t+"name="+rsmd.getColumnName(i));
if(t==12||t==1||t==3)
{
if(rs.getString(i)==null||rs.getString(i).equals(""))
htable.put(rsmd.getColumnName(i),"");
else
htable.put(rsmd.getColumnName(i),rs.getString(i));
}
elseif(t==93)
{
htable.put(rsmd.getColumnName(i),rs.getDate(i).toString());
}
elseif(t==2||t==4)
{
htable.put(rsmd.getColumnName(i),Integer.toString(rs.getInt(i)));
}
}
ListRs.add(htable);
}//e
returnListRs;
}
catch(ExceptionlistError)
{
System.out.println("数据库操纵失利!"+listError);
returnnull;
}
finally
{
try
{
closeDB();
}
catch(ExceptioncloseErr)
{
System.out.println("封闭数据库堕落:"+closeErr);
}
}
}
}
成绩8:jsp的程序也有计划的不敷公道的中央
比方:选择一个下拉框,提交一次,列出所选的数据,选择别的一个下拉框再次提交,再次列出所选的数据。
办理办法:
只管一次把前提选择终了,然后列出所选择的数据,而且在数据多的时分,只管利用翻页,削减运转工夫。
成绩9:功能优化,只管利用PreparedStatement
办理办法:
PreparedStatement对象和利用的一般的Statement对象有两点分歧。
第一,它们是为了功能更快而由JDBC驱动程序或数据库编译(预编译)的。
第二,它们承受一个或多个静态输出参数,称为IN参数。这两点让PreparedStatement对象合用于反复的SQL操纵,个中操纵基础上都是一样的,只要巨大的差别(如数据载进)。要让SQL语句在利用前准备好,在PreparedStatement对象创立时必需将SQL传送到JDBC驱动程序,而不是在其实行时才传送。
IN参数用SQLString中的?占位符暗示。在PreparedStatement可以乐成地实行前,还必需挪用PreparedStatement对象的setXXX()办法来设置IN参数,在这里XXX被设置的参数的数据范例所交换。因此,要将第一个IN参数设置为整数值100,您应当挪用setInt(1,100)。一样地,要将第二个IN参数设置为字符串值“rjb”,您应当挪用setString(2,"rjb")。最初一点是,设置好的参数值在设置为一个新的值,或用clearParameters()显式地扫除之前会坚持稳定。这很主要,由于PreparedStatement能够被屡次实行;假如您不注重的话,就会让您的数据库充斥无用数据。
成绩10:
1、把不必的jsp文件收拾.
成绩11:提交页面,每次都提交两次。
缘故原由:
1、
<inputtype="submit"name="sendit"value="发送"class=buttononclick="javascript:if(chkit())form_submit(broadcast_operation.jsp?s_coming=1&s_num=<%=str_num%>)">
这里假如type=”sbumit”,页面就会提交两次,(这个bug信任人人都晓得实在没需要提出来)
在onclick事务内里会提交一次,而submit按钮自己也会提交一次。
办理办法:
假如在onclick事务内里提交页面,按钮的范例type必定不成所以”submit或image”按钮。
能够是”button”.
办理办法:
往失落如许<metahttp-equiv="refresh"content="600">
的语句。
成绩13:在跳转到其余页面的时分,要加return。
不然大概会引发毛病。跳转不外往。
If{
request.getRequestDispatcher("/xxx/ErrorPage.jsp?s_mark=error:recordhaveexisted").forward(request,response);
return;
}
else
{
response.sendRedirect();
//倡议用下面的办法
return;
}
什么时候上述的三种开发工具能和三为一,什么时候java的竞争力才更强,才有机会拉拢更多的程序员投入到对java的开发上,因为到时的开发工具将会比.net的更简单。还有一点也很关键,什么时候java推出的jsf能成为真正意义上的标准。 |
|