java写mysql效率_提高java和mysql代码性能和质量

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值