




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
J2EE应用开发问题总结及最佳实践,2,内容,J2EE应用开发和移植中遇到的问题总结 J2EE应用上线后遇到的问题总结 J2EE应用开发部署最佳实践 一些例子分析,3,J2EE应用开发和移植中遇到的问题总结-数据库部分,问题一:使用Oracle数据库,大于4k的附件上传有问题,会报java.sql.SQLException: Connection reset by peer: socket write error错误 解答:附件上传过程是先上传到应用服务器,再以二进制形式保存到BLOB字段。上传组件采用SmartUpload,上传过程没有问题。问题出在对BLOB字段的操作上,在获取到附件的流对象后,用PreparedStatement的ps.setBinaryStream(),然后再ps.executeUpdate()。这种方式对小于4k的附件没有问题,大于4k就会报错。解决办法是 在插入BLOB字段值时,要先用SELECT BLOBCOL FROM TABLENAME FOR UPDATE查询和锁定该字段,然后再做更新。,4,J2EE应用开发和移植中遇到的问题总结-数据库部分,问题二:对Oracle BLOB字段的处理问题 解答:在Weblogic中,只能支持weblogic自带的对Oracle BLOB处理的类,而在WebSphere中,只能支持Oracle自带的处理BLOB的类,因此在程序中根据条件分支判断应用服务器的类型来决定用哪个类处理BLOB。,5,J2EE应用开发和移植中遇到的问题总结-数据库部分,问题三:流程定义文件加载问题,加载流程定义文件的过程就是解析并将文件中的流程描述信息提交到数据库表。在一个连接事务中,如果多次调用PreparedStatement的addBatch()、executeBatch()方法做批量数据更新,会报oracle.jdbc.dbaccess.DBData.clearItem错误。 解答:应用服务器中数据源的PreparedStatementCacheSize默认设置为10,需要改为0不缓存或者改为100,就可以使用executeBatch()了,6,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题一:JSP自定义标签属性大小写 解答:在使用系统自定义的标签属性时,属性名必须严格区分大小写,否则JSP编译不通过。,7,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题二:URL编码问题,通过单击打印按钮请求一些报表打印页面时编译出错,会抛出传入的参数不合法的异常 解答:由于URL编码格式引起的,如 jbtsxf_xfcl_bb.jsp?where=aab001 like %D,在URL编码中以%开头后面跟两位16进制编码代表一些特殊字符,这里的%D不对应任何特殊字符,所以出错。解决办法是将URL串中的特殊字符用对应的URL编码代替,如把%用%25代替。 具体可以参考以下网址:/support/docview.wss?uid=swg21165681,8,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题三:文件名的大小写 解答:通过include引入文件时也要区分文件路径的大小写,系统中绝大部分JSP的head和body开始部分都会引入系统公用的两个文件,即:/htmlHead.jsp和/bodyStart.jsp,但在不少地方被引用为/htmlhead.jsp和/bodystart.jsp,这在WebSphere上会引起编译错误。,9,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题四:JSP标准标签属性值误用问题 解答:如 ,flush属性应该只有true和false两个有效值,如果flush取其它值,JSP编译也不通过。,10,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题五:JSP中import Vector类的问题 解答:在JSP中已经import了class A,而class A中已经import了Vector,因此JSP里面要应用Vector的时候就没有再去import Vector,导致编译出错。,11,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题六:“ value=“ 解答:jsp: param里面的name属性不能使用jsp表达式赋值,参考jsp1.2 spec name是不能使用表达式的。修改name为定义好的字符串常量,12,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题七:某个页面readfile.jsp有时候能正常访问,有时候出现http 404 解答:readfile.jsp中需要用到某个htc文件,但该htc文件的路径有误导致IE在最后渲染时提示找不到文件,需要修改htc路径。,13,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题八:某个jsp页面使用引入HTML页面,出现乱码 解答:引入的HTML页面也必须使用进行声明,由于是静态引入方式,修改这些包含页面后,对原来的jsp也应该进行重新编译才能获得效果。但是只适用于WebSphere6。如果是采用动态引入方式的话,就不需要手动进行重新编译。,14,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题九:在一个jsp页面中包含下载内容,调用了response.getOutputStream()方法时,抛出exception 解答:在jsp中已经隐含一个变量out,相当于调用了response.getPrintWriter(),因此再次调用response.getOutputStream()时会抛出输出流已经获得的异常。可以修改代码,不采用jsp调用形式,改用servlet直接使用流输出。,15,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题十:不要用关键字来定义变量 解答:在执行 之前,代码定义一个变量String org; 其中org属于关键字,因此编译的错误!,16,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题十一:JSP中使用ShowModalDialog弹出一个新窗口会造成session丢失 解答:改成用Window.open(),17,J2EE应用开发和移植中遇到的问题总结-JSP部分,问题十二:jsp:forward抛出异常:java.lang.IllegalStateException: jsp.error.attempt_to_clear_flushed_buffer 解答: “/ “/ “/ 在有jsp:forward语句的jsp中,不能有其他html的元素的输出,18,J2EE应用开发和移植中遇到的问题总结-体系架构部分,问题:在实现异步消息侦听的功能时,采用一个非容器受管的线程实现javax.jms.messageListener接口来完成,并没有使用MDB,导致在WebSphere上出现异常错误,被迫要改成同步侦听的方式,使性能下降。 解答:在J2EE规范中提倡采用MDB来完成异步消息侦听的工作,而不接受自己用线程来实现的做法。这样做的好处是因为MDB是受EJB容器管理的一个组件,开发和维护简单,移植性好。,19,内容,J2EE应用开发和移植中遇到的问题总结 J2EE应用上线后遇到的问题总结 J2EE应用开发部署最佳实践 一些例子分析,20,J2EE应用上线后遇到的问题总结-使用开源组件,问题一:采用SmartUpload组件实现文件上传功能,SmartUpload组件本身存在一定的缺陷,容易造成内存泄漏。 解答:通过对heapdump文件进行分析,对系统出现的OutOfMemory现象,是因为在SmartUpload中有一段代码不是十分严密,会在某种情况下出现死循环,然后导致系统内存溢出,不能正常提供服务。 解决的办法是对SmartUpload的代码进行部分修改,使之不产生死循环。 具体的分析过程请参考附件一。,21,J2EE应用上线后遇到的问题总结-优化对数据库的访问,问题二:某些jdbc语句过于庞大,导致该语句的执行时间过长而锁住了jdbc连接等资源不被释放。 解答:建议检查sql语句的效率,把一个语句中执行的复杂操作优化成效率高的sql语句来执行。,select sqlb, currenthj, currentstate, sum(jjbs0), sum(jjbs1), sum(jjbs2), sum(tbbs1), tbdwbh from Todolist where sqlb=101 and (currenthj=001 or currenthj=006 or currenthj=011 or .) and (clr=st001 or clr is null) and (tbdwbh like 44%) group by sqlb,currenthj,currentstate,tbdwbh order by sqlb,currenthj,currentstate,tbdwbh,select sqlb, currenthj, currentstate, sum(jjbs0), sum(jjbs1), sum(jjbs2), sum(tbbs1), tbdwbh from Todolist where sqlb=101 and (currenthj in (001,006,011,016,021,031I1,031I2,031I3,031J1,031J2,031J3,031K1,031K2,031K3,031M1,031M2,031M3,041,050,052,056,061,062,063,066,071,076,078,081,086,087,088,089,090,091,092,096,101,106,108,111) and (clr=st001 or clr is null) and (tbdwbh like 44%) group by sqlb,currenthj,currentstate,tbdwbh order by sqlb,currenthj,currentstate,tbdwbh,22,J2EE应用上线后遇到的问题总结,问题三:防火墙策略的影响 解答:假如应用服务器连接数据库的时候要通过防火墙的话,那么要仔细设置策略中的超时部分,不要与应用服务器连接数据库的超时设置相抵触。如果防火墙的超时设置要短于应用服务器的设置,那么数据库连接就会被防火墙频繁的截断,从而引起性能的下降。,23,J2EE应用上线后遇到的问题总结-优化对数据库的访问,问题四:要珍惜jdbc连接资源 解答:jdbc连接是非常宝贵的资源,当要用到的时候才去获取,而不要占住了一个连接却不使用它,也不要使用完了不释放它,这样会使应用程序的效率很低。总结来说,就是在初始化的时候对datasource作一次jndi lookup的动作,然后接下来当要使用jdbc连接的时候通过getConnection获取连接,在使用完毕后通过conn.close()关闭,使之返回到连接池中被其他代码使用。,24,J2EE应用上线后遇到的问题总结-使用开源框架,问题五:慎用各种开源的框架 解答:目前各种开源的框架非常流行,例如hibernate, tapestry, struts, spring等等,这些框架使用起来也会简化开发的工作量,但是一定要注意这些框架下的合理参数配置,否则会引起系统级别的性能问题。例如在出入境的性能问题中,基本上都是因为这些框架下的参数没有正确的配置引起太多对象堆积在内存空间中不能被释放,造成内存泄漏。 具体问题的分析办法请参考附件二和附件三。,25,J2EE应用上线后遇到的问题总结,问题六:关于WAS做集群的问题 解答:应用程序的开发应该与应用服务器的拓扑结构相独立,而不应该成为部署的障碍。例如像广东省出入境如此庞大的系统,总共包括19台刀片服务器来运行应用服务器,如果能够建立起集群的环境,无论从部署、维护还有性能方面都能大大提高。,26,内容,J2EE应用开发和移植中遇到的问题总结 J2EE应用上线后遇到的问题总结 J2EE应用开发部署最佳实践 一些例子分析,27,J2EE应用开发部署最佳实践-开发部分,整体考虑 开发应遵循标准的软件工程方法论 开发应遵循J2EE规范 开发尽量使用成熟的框架以及开发模式 变量名、类名、对象名、包名应该遵循命名规范 对象的构造 尽量避免在被经常调用的代码中创建对象 对于集合类(collection),应尽量初始化它的大小 JVM会自动指定缺省大小 如果超过,JVM会重新创建一个,释放掉原来的对象,加大JVM负担,28,J2EE应用开发部署最佳实践-开发部分,当一个类的多个实例在其本地的变量里访问一个特定的对象时,最好将这个变量设计为静态(static)的,而不是每个实例中变量里都存放那个对象的引用尽量重用对象的引用,而不是new 注意释放容器对象中所保存的指向别的对象的引用 尽量使用primitive数据类型 当只是访问一个类的某个方法时,不要创建该类的对象,而是将该方法设计成一个static的方法。 尽量简化类的继承关系和设计简单的构造函数 创建简单数据类型的数组要比初始化一个这样的数组快,创建一个复杂类型的数组要比克隆一个这样的数组快,29,J2EE应用开发部署最佳实践-开发部分,字符串(String) 事实:String对象是不可改变的 如果字符串在程序中可能被改变,比如增加、接或删除字符,就应使用StringBuffer。创建具有初始大小的StringBuffer对象,尽量重用该对象,而不使用“+”操作 分析字符串中的字符时,就不要使用String或StringBuffer,而是使用字符数组,特别是在循环中分析字符时更应该如此 尽量少用StringTokenizer,它的方法的性能比较差,30,J2EE应用开发部署最佳实践-开发部分,输入输出(Input/Output) 小块小块的读写数据会非常慢,因此,尽量大块的读写数据 使用BufferedInputStream和BufferedOutputStream来批处理数据以提高性能 对象的序列化(serialization)非常影响I/O的性能,尽量少用 对不需序列化的类的域使用transient关键字,以减少序列化的数据量,31,J2EE应用开发部署最佳实践-开发部分,循环(Loop) 循环常量,在循环中它的值不会改变,因此,它的值应该在循环外先计算出来。 本地变量(Local Variable),在方法中使用本地变量比使用对象的属性消耗较少的资源。在循环中却不一样,因为循环中的代码要反复地被运行,因此,尽量少地在循环中创建对象和变量。 尽早结束循环,如果循环体在满足一定条件就可以结束,就应尽快结束。,32,J2EE应用开发部署最佳实践-开发部分,集合类(Collections) Collection 这是集合类的基本接口,它为一组对象提供了一些简单的方法, List 具有可以控制的顺序,但并没有定义或限制按什么排序 Set 不能包含重复的元素 Map 将一个键(Key)影射到一个值(Value),不允许有重复的键 Vector和ArrayList Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),33,J2EE应用开发部署最佳实践-开发部分,ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间 Hashtable和HashMap 类似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是 ArrayList和LinkedList ArrayList的内部实现是基于内部数组Object,34,J2EE应用开发部署最佳实践-开发部分,LinkedList的内部实现是基于一组连接的记录,更像链表结构 当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能 当操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了 如果两种情形交替出现,可以考虑使用List这样的通用接口,而不用关心具体的实现,由实现去保证性能,35,J2EE应用开发部署最佳实践-开发部分,方法(method) Java编译器会把一些代码转为代码嵌入,提高性能 Final、static、private 同步(Synchronized) 使用同步方法比使用非同步方法的性能要低 应尽量少使用同步方法 同步方法的代码本身就不应该再同步了,36,J2EE应用开发部署最佳实践-开发部分,EJB部分 为EJB实现本地接口 始终通过会话Bean访问实体Bean 尽量缓存对EJB Home的访问 当使用 EJB 组件时,始终使用会话 Facades 尽量使用无状态会话 bean,而不是有状态会话 bean 尽量使用容器管理的事务,37,J2EE应用开发部署最佳实践-开发部分,Servlet部分 init()做尽可能多的工作 只在初始化是执行一次 尽可能少地使用 Synchronize 确保不要 synchronize 整个类 不要用任何实例变量 被所有在线的用户使用 不要使用SingleThreadModel 虽然是 thread-safe, 但性能太差 对于非 Java 群体: 不要在 cookies 中存对象 使用 HttpSession 代替,38,J2EE应用开发部署最佳实践-开发部分,JSP部分 保持尽量少的Java代码 JSP中的Java代码很难维护和测试 绝对不要将业务逻辑放在JSP中 编写 helper classes 从数据生成HTML One of the few times putting hardcoding HTML in Java is okay 理想情况下只使用 “” tags 在每一个JSP只包含用于显示数据的简单对象 有时称之为 “view bean”, 但不用是一个真的 JavaBean 限定 JSP 只做显示工作, 抵制在其中编写的商业逻辑的诱惑,39,J2EE应用开发部署最佳实践-开发部分,JSP部分 如果在页面中你要共享组件和项目, 使用如下表格 E.g. 对于菜单, 标题栏, 页脚,等等 可以使用 HTML 或者 JSP include 指令 可以包括静态 HTML, 或者其它 JSP 不要忘记在整个 JSP 中使用 try/catch 如果在 JSP 中抛出一个异常, 它不能被 servlet 捕获 作为替代, 将所有有异议的代码放在头部, 将这一部分封装在try/catch 中,40,J2EE应用开发部署最佳实践-开发部分,数据库访问部分 规格化(Normalization)数据库结构 针对常用的SQL操作建立索引,删除多余的索引 尽量使用Prepared Statements 合理运用PreparedStatement和连接池 考虑批量执行SQL命令 考虑使用数据库存储过程 及时关闭不用的Statement、ResultSet、Connection等对象(但不是在finalize方法内),41,J2EE应用开发部署最佳实践-开发部分,HttpSession部分 确保放在session 中的每一个对象要实现 Serializable (or Externalizable) 不是必须的, 但在分布式应用中是一个好的方法 避免在 session 中存放大对象 手工使 session 无效 Can only do this if application has explicit log out function 如果在JSP中不需要session,禁用它 ,42,J2EE应用开发部署最佳实践-开发部分,其它 JSP中保持尽量少的Java代码 尽可能减少HTTP数据传输的总量和频度 尽量使用局部变量 不要重复初始化变量 只有在必要时才运用线程安全的类 在servlet、EJB中不要使用多线程 尽量使用日志记录框架类如log4j输出跟踪信息,而不是使用简单的System.out.println() 从正式发行的软件中删除调试信息,43,J2EE应用开发部署最佳实践-开发部分,备注:WAS是遵循J2EE标准的成熟的应用服务器(可用性99.999%),其可靠性远高于应用,在系统出现问题时,请首先考虑应用的问题!,44,J2EE应用开发部署最佳实践-部署管理部分,根据应用状况设置JAVA堆大小 根据应用状况设置webcontainer thread pool size大小 根据应用状况设置ORB thread pool size大小 根据应用状况设置JDBC connection pool size大小 根据应用状况设置JDBC connection的prefetch size大小 多个应用共用jar包时使用共享库 尽量缓存会话、有状态会话bean DM上的结点数(Nodes) 30 每个节点上的server数(Application servers per node) 20,45,J2EE应用开发部署最佳实践-部署管理部分,每个单元中的server数(Total number of application servers per cell) 60即总的(application servers x nodes) 60 每个sever上的应用数(Applications per application server) 100 每个应用上的EJB数(EJBs per application) 250 在生产平台尽量少打日志 具备规范的生产、测试平台、生产平台,最好物理分开,限制可以接触到生产平台的人员 借助测试工具进行大于生产压力的压力测试 根据压力测试结果,调整系统参数、WAS参数,然后继续测试以验证调整效果,46,J2EE应用开发部署最佳实践-部署管理部分,应用必须经过开发平台测试,才能上测试平台,经过测试平台测试才能正式上生产,47,内容,J2EE应用开发和移植中遇到的问题总结 J2EE应用上线后遇到的问题总结 J2EE应用开发部署最佳实践 一些例子分析,48,一些例子分析,无意识的集合对象保留 Vector v=new Vector(10); for (int i=1; i100; i+) Object o=new Object(); v.add(o); o=null; 问题:上面用的Vector中的临时对象Object被释放了吗? 回答:没有!,49,一些例子分析,显示的赋Null值起作用吗? 定义:赋空变量是指简单地将 null 值显式地赋值给这个变量,相对于让该变量的引用失去其作用域 最佳实践 正确地设置变量的作用域,而不要显式地赋空它们 显式赋空变量一般应该没有影响 但是,在一些场合下会对性能产生巨大的负面影响 例如,迭代的或者递归的赋空集合内的元素使得这些集合中的对象能够满足垃圾收集的条件 实际上是增加了系统的开销而不是帮助垃圾收集,50,一些例子分析,所以前面的例子中,怎么样才是相对比较好的办法让JVM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年地热能发电在沿海地区应用前景研究报告
- 2025年机车整备工(高级)职业技能考试题库及答案
- 2025年煤矿安全检查证考试题库及答案
- 2025年麻醉药品、精神药品培训试题有答案
- 2025年国家基本公共卫生服务岗位职业技能考试题库含答案
- 2025年新能源产业碳排放交易市场分析及应对策略报告
- 2025年国家公务员考试行测真题及答案解析
- 2025年大学融合教育专业题库- 互动式学习与融合教育
- 基础试题及答案解析
- 2025年大学警卫学专业题库- 校园警卫队伍巡逻技巧
- T-CPI 11037-2024 石油天然气钻采设备水力振荡器技术与应用规范
- 中级审计理论与实务知识导图
- 中介招聘合同范例
- 医学免疫学+医学心理学 医学免疫学课程讲义
- 2025年临床医师定期考核必考复习题库及答案(900题)
- 原材料验收管理制度内容
- 《中国美术简史》课件
- 环卫车辆驾驶员安全培训
- 大客户销售工作规划及思路
- 京东方校园2024招聘胜任力测评题库
- 中建营盘山隧道2号斜井泄水专项施工方案
评论
0/150
提交评论