0.if嵌套的层数最好不要超过3层
importjava.util.HashMap;
importjava.util.Map;
publicclassQiantao {
/*
* 嵌套太多层if,阅读性非常差,和看递归代码一样
* @author yifangyou
* @since 2011-08-16 09:35:00
*/
intexample1(inta,String path,String account,String user){
intresult=0;
if(account!=null){
if(a==1){
if("/createAccount".equals(path)){
if(createAccount(account)){
result=1;
}else{
return-4;
}
}elseif("/createUser".equals(path)){
if(isExistsAccount(account)){
if(createUser(account,user)){
result=2;
}else{
return-6;
}
}else{
return-5;
}
}else{
result=-3;
}
}else{
result=-2;
}
}else{
result=-1;
}
returnresult;
}
Map paths=newHashMap(){{
this.put("/createAccount",1);
this.put("/createUser",2);
}};
/*
* 采用return减少嵌套层数,层次分明,便于修改,增加和删除判断比较容易
* @author yifangyou
* @since 2011-08-16 09:35:00
*/
intexample2(inta,String path,String account,String user){
if(account==null){
return-1;
}
if(a!=1){
return-2;
}
Integer pathId=paths.get(path);
if(pathId==null){
return-3;
}
switch(pathId){
case1:
if(!createAccount(account)){
return-4;
}
return1;
case2:
if(!isExistsAccount(account)){
return-5;
}
if(!createUser(account,user)){
return-6;
}
return2;
default:
return0;
}
}
privatebooleanisExistsAccount(String account) {
// TODO Auto-generated method stub
returnfalse;
}
privatebooleancreateUser(String account, String user) {
// TODO Auto-generated method stub
returnfalse;
}
privatebooleancreateAccount(String account) {
// TODO Auto-generated method stub
returnfalse;
}
}
1.尽量重用数据库连接或者文件句柄
2.过分的创建对象会消耗系统的大量内存,严重时,会导致内存泄漏,因此,保证过期的对象的及时回收具有重要意义。
JVM的GC并非十分智能,因此建议在对象使用完毕后,手动设置成null。
3.采用在需要的时候才开始创建的策略。
4.array(数组)和ArrayList的使用。
array 数组效率最高,但容量固定,无法动态改变,ArrayList容量可以动态增长,但牺牲了效率。
5.尽量使用基本数据类型代替对象。
6.使用具体类比使用接口效率高,但结构弹性降低了
7.读取配置文件内容,最好放在static变量里,不要用到时再解析配置文件
8.避免在同一个类中动过调用函数或方法(get或set)来设置或调用变量
9.输入和输出(I/O),避免多次读写同一个文件,读时最好尽量一次读取完需要的数据,写时,先把要写的内容全部放到变量里,一次写入文件
10.数据库查询最好使用PrepStatement防止SQL注入,提高性能,prepStatement减少解析sql语句时间
droptableIF EXISTS t1;
createtablet1(idintNOTNULLAUTO_INCREMENT,namevarchar(10),PRIMARYKEY(`id`));
droptableIF EXISTS t2;
createtablet2(idintNOTNULLAUTO_INCREMENT,namevarchar(10),PRIMARYKEY(`id`));
DROPPROCEDUREIF EXISTS test;
DELIMITER ;;
CREATEPROCEDUREtest()
BEGIN
truncatet1;
truncatet2;
set@start_time=UNIX_TIMESTAMP();
set@id=1;
SET@sql_str ="insert into t1 values(?,'a')";
PREPAREstmtFROM@sql_str;
REPEAT
EXECUTEstmt USING @id;
set@id=@id+1;
UNTIL @id>100000ENDREPEAT;
DEALLOCATEPREPAREstmt;
selectUNIX_TIMESTAMP()-@start_timeasspan;
set@start_time=UNIX_TIMESTAMP();
set@id=1;
REPEAT
insertintot2values(@id,'a');
set@id=@id+1;
UNTIL @id>100000ENDREPEAT;
selectUNIX_TIMESTAMP()-@start_timeasspan;
END;;
DELIMITER ;
call test();
11.能够在数据库里做的操作,尽量在数据库里做,因为数据是集合运算
12.带索引的inner join 比in效率高得多
selectcount(*)fromregion;
selectcount(*)fromcidr;
selectSQL_NO_CACHEcount(*)fromcidrwhereregion_idin(selectidfromregion);
selectSQL_NO_CACHEcount(*)fromcidrinnerjoinregiononcidr.region_id=region.id;
13.经常查询的字段加上索引,这个能够提高20倍
14. 当只要一行数据时使用 LIMIT 1,这样mysql查询到1条后可以马上返回结果;
15.避免 SELECT *,查询哪个字段就写哪个,这样可以减少查询时间和网络传输;
16. 拆分大的 DELETE 或 INSERT 语句
如果你需要在一个在线的网站上去执行一个大的 DELETE 或 INSERT 查询,你需要非常小心,要避免你的操作让你的整个网站停止相应。
因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了。
17.隐式提交
在事务执行过程中,执行下面语句相当于执行COMMIT
ALTERFUNCTION,ALTERPROCEDURE,ALTERTABLE,BEGIN,CREATEDATABASE,CREATEFUNCTION,CREATEINDEX,CREATEPROCEDURE,CREATETABLE,DROPDATABASE,DROPFUNCTION,DROPINDEX,DROPPROCEDURE,DROPTABLE,LOADMASTER DATA, LOCK TABLES, RENAMETABLE,SETAUTOCOMMIT=1, STARTTRANSACTION,TRUNCATETABLE, UNLOCK TABLES.
truncate 或者drop临时表会引起隐式提交
CREATE TEMPORARY TABLE 临时表不会引起隐式提交
delete from 临时表不会引起隐式提交
CREATE VIEW 会引起隐式提交
18.事务并行问题,按照谁先执行事务的顺序生效
两个事务同时delete,update,insert操作同一行时,或者含有自增id时会引起挂起
create table t(id int NOT NULL AUTO_INCREMENT,name varchar(10),PRIMARY KEY (`id`));
create table t(id int NOT NULL,name varchar(10));
--客户端A
SETAUTOCOMMIT=0;
insert into t values (1,'a');
--客户端 B
SETAUTOCOMMIT=0;
insert into t values (1,'b');
----------------------------------------
--客户端A
SETAUTOCOMMIT=0;
insert into t values (2,'a');
--客户端 B
SETAUTOCOMMIT=0;
delete from t whereid=2;
--或者
update t setname='c'whereid=2;
----------------------------------------
--客户端A
SETAUTOCOMMIT=0;
delete from t whereid=2;
--客户端 B
SETAUTOCOMMIT=0;
update t setname='c'whereid=2;
--或者
delete from t whereid=2;