程序优化

JSP与JavaBean优化

1.尽量少用“+”来连接字符串,而应该使用StringBuilder ,做个实验,t1用的时间大概是t2的两倍,所以应该使用StringBuilder来做字符串相加。

		long s1=System.currentTimeMillis();
		for(int i=0;i<100000;++i){
			String name="name";
			System.out.println(name+":张三");
		}
		long e1=System.currentTimeMillis();
		long t1=e1-s1;
		
		long s2=System.currentTimeMillis();
		for(int i=0;i<100000;++i){
			StringBuilder name=new StringBuilder("name");
			System.out.println(name.append(":张三").toString());
		}
		long e2=System.currentTimeMillis();
		long t2=e2-s2;	
		System.out.println("t1:"+t1);
		System.out.println("t2:"+t2);
2.使用Log4j来打印日志记录,而不是System.out.println();
3.尽可能的使用static , final, private 关键字 ,在允许的范围内,可以将属性或方法的访问权限设到最小。

4.设计JSP页面,在页面中通常要把相同的部分抽取出来,保存成单独的JSP文件。便于维护,每次只修改一处。

<%@include file="file"%>通常情况下为静态页面,比运行时才确定的效率高。

<jsp:include page="head.jsp" flush="true"/> 它的引入是在运行时完成,因此对输出的结果的控制更加灵活。只有当被引入的页面需要被频繁的修改时,或者未发出请求之前无法确定需要引入的页面时,才会使用include动作。

5.合理设置JavaBean声明周期,<jsp:useBean id="name" class="com.javabean.User" scope="page"/> 将范围设的足够小。

6.默认情况下会为每一个JSP页面创建一个Session,若是JSP页面不需要Session,可以通过一下的方式不为该页面创建Session

<%@ page session="false" %>


在编码的过程中,不要只为了提高性能而省去一些必要操作,例如捕获必要异常,检查方法参数的合法性。检查会降低软件的性能,但是为了软件系统的安全运行,这点性能的付出还是值得的。


hibernate优化

1.充分利用检索策略

检索策略有立即检索,延迟检索,批量检索和迫切左外连接检索。

若是多数情况下加载当前对象时,并不需要立即加载关联对象,则对关联对象采用延迟加载策略。

若是每次加载当前对象时都要立即加载关联对象,对关联对象应采用立即检索策略。

在立即检索的情况下,还可以设置是否采用批量检索策略,以及每次检索的数量,通过batch-size属性实现。默认不采用批量检索。经验表明batch-size取值在2~10时较好,若是设置过大,复杂的select语句会影响对象的加载速度。

迫切左外连接与立即检索的功能是相同的。迫切左外连接实现方式有两种,第一种<many-to-one>和<one-to-many>中<set>元素的fetch属性。该属性的默认值为select,即不采用迫切左外连接策略,若是改为join则使用迫切左外连接策略,不过只对get/load方法有效。另一种比较常用,使用HQL语句实现,

from comp Company   left join fetch comp.depts where comp.id=4
2.批量增加(调用save方法)时,为了避免内存溢出的情况,应当阶段性地通过Session实例的clear()方法清空一级缓存,将持久化对象同步到数据库中。

3.在检索指定对象时,应该使用get,而不是load,因为①get立即加载,load延迟加载,若是检索指定对象,肯定是要立即使用(不然你检索出来干嘛),所以使用get

②get方法若未找到指定对象,返回null,可以据此来判断是否有符合条件的对象。而load会抛异常。

4.批量检索对象时,合理使用 list 与 iterator 方法。list每次都会重新从数据库加载全部符合要求的,即使你上次加载过了,iterator会加载对应编号(主码),当你使用某个对象时,它会寻找缓存,若是有加载过的,便直接拿来用,若是没有则重新调用一次select语句。详情请阅读这个

5.通过Session的createFilter方法对关联对象进行充分过滤,当一个持久化对象获得关联对象的集合时,集合中包含的是所有与该持久化对象关联的对象,若是只用到一部分或是检索关联的对象集合的一个属性,可以通过session的createFilter()方法进行过滤。详情请阅读这篇文章

Query query=session.createFilter(teacher.getStudents(),"where score<60 order by name");
List list=session.createFilter(customer.getOrders(),”select this.ordernumber ”).list();
6.合理运用事务,通常情况下,只有增删改需要开启事务,进行检索时不需要开启事务。JTA事务和JDBC事务。

四种事务的隔离级别(隔离级别依次递减):Serializable,Repeatable Read , Read Committed, Read Uncomitted一般设置为第三种,它带来的问题可以由锁机制来解决.

7.充分利用缓存机制

一级缓存:通常程序员对这个缓存不干预,交给hibernate自行管理。

二级缓存:是SessionFactory实例级的缓存,因此通过该SessionFactory创建的Session共享此缓存。二级缓存默认关闭,需要由程序员手动开启。

开启的办法是在Hibernate配置文件中添加如下代码,设置缓存提供类。

<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
使用二级缓存注意:数据不应太大,数据会被频繁读取,数据不会被频繁修改,数据不会被第三方修改,数据不应是敏感数据(涉及钱财,安全等)。

不要想当然的以为缓存一定能提高性能,仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的,不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用,可能会有1+N的问题。不当的使用还可能导致读出脏数据。如果受不了hibernate的诸多限制,那么还是自己在应用程序的层面上做缓存吧。 在越高的层面上做缓存,效果就会越好。就好像尽管磁盘有缓存,数据库还是要实现自己的缓存,尽管数据库有缓存,咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么,只能做的比较通用,而高层可以有针对性的实现缓存,所以在更高的级别上做缓存,效果也要好些吧。 

数据库优化

对数据库性能的影响的因素中80%来自不良的SQL语句,虽然SQL语句很容易,但是难以精通。

设计数据库时,可将数据划分为两类,分别为经常被访问的和经常被修改的。对于经常被访问而不经常被修改的数据,数据表的设计应当适当违反数据库设计规范,以提高数据库的查询性能,因为过度细化的表结构会产生复杂的表间关系,连接就越频繁,而连接又十分浪费时间。对于经常被修改但不经常被访问的数据,数据表的设计应该遵循数据库的设计规范。

可以开始完全按照规范进行设计,然后根据实际的需要对数据库进行适当修改。

在设计数据表定义数据列的类型时,建议遵循一下原则:

1.在能满足数据需求的情况下,应尽可能使用较小的数据类型

2.将所有列设置不为空

3.数据列的类型尽量少使用 varchar 和 text

4.当数据列的字符串长度大于200时,不要设置为varchar类型

5.对于日期列尽量使用smalldatetime类型

编写SQL时,建议遵循一下原则:

1.尽量避免没有任何查询条件的SQL语句

2.在编写SQL语句时,应充分利用别名

3.尽量减少查询数据库次数

4.尽量使用相同的或者相似的SQL语句进行查询,这样可以利用SQL共享池中已经分析完成的语法树,加大了SGA中查询到符合数据的可能性。

5.尽量避免使用动态的SQL语句,因为即使两次执行相同,数据库依然会重新进行语法解析。

6.检索大量数据时,尽量使用select top 100限制每次返回的行数

7.在使用in关键字时,后面跟随的匹配值应该按照从最可能被匹配到到最不可能被匹配到的顺序排序。

8.在“>=”和“>”之间尽量使用“>=”

9.对于"where name like 'zhangsan' " 应修改为 "where name='zhangsan' "

10.对于“where  salary >=100*2” 应改为“where salary >=200”
对于SQL语句的优化,更多的是对复杂语句的优化,例如子查询,连接查询等,编写复杂的SQL语句,应尽量多尝试几种方法,并从中寻找出性能最佳的实现方式。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值