1. 避免字符串相加
這是個(gè)老生常談的問(wèn)題,但是在寫servlet的時(shí)候,很多人在輸出html時(shí),
這樣寫
String a = "<html> ";
String b = "</html>";
String c = a + b;
應(yīng)該使用StringBuffer,
String a = "<html> ";
String b = "</html>";
StringBuffer sb = new StringBuffer(a);
sb.append(b);
String c = sb.toString();
最好使用StringBuffer的帶參數(shù)構(gòu)造來(lái)代替默認(rèn)的構(gòu)造函數(shù),因?yàn)镾tringBuffer的append()方法返回
一個(gè)StringBuffer實(shí)例,最好的寫法是這樣:
StringBuffer sb = new StringBuffer(256);
StringBuffer sb = new StringBuffer();
sb.append("<html> ").append("</html>");
2.不要使用StringTokenizer
例如解析字符串
import java.util.StringTokenizer;
public class TestStringTokenizer
{
public static void main(String[] args)
{
String s = "a,b,c,d";
StringTokenizer st = new StringTokenizer(s, ",");
while (st.hasMoreTokens())
{
String token = st.nextToken();
System.out.println(token);
}
}
}
可以使用String.indexOf()完成相同的功能
public class TestIndexOf
{
public static void main(String[] args)
{
String s = "a,b,c,d";
int begin = 0;
int end = s.indexOf(",");
while (true)
{
String token = null;
if (end == -1)
{
token = s.substring(begin);
}
else
{
token = s.substring(begin, end);
}
System.out.println(token);
// End if there are no more delimiters
if (end == -1) break;
begin = end + 1;
end = s.indexOf(",", begin);
}
}
}
3.一般不要log輸出
一般不要使用System.out.println()作為日志輸出,最好使用log4j,更易于打開(kāi)和關(guān)閉輸出
if(logger.isDebugEnabled()){
logger.debug("logging method handleRequestInternal()....");
}
4.避免不必要同步
servlet容器是個(gè)多線程的系統(tǒng),java的關(guān)鍵字synchronized.避免某些情況的程序死鎖,但是性能確實(shí)大大的降低了。
除非特別必要,否則不要使用synchronized。
5.盡量使用PreparedStatement
多次使用相同的查詢語(yǔ)句,PreparedStatement的效率很高,而且避免了sql注入。
6.盡量使用連接池
使用連接池,可以減少建立連接的時(shí)間,而且可以減輕數(shù)據(jù)庫(kù)的連接壓力。
7.大量的使用cache
對(duì)于經(jīng)常查詢相同數(shù)據(jù)的網(wǎng)站程序,使用cache是優(yōu)化的不二法門,oscache是個(gè)廉價(jià)的方案。
8.優(yōu)化servlet容器
關(guān)閉容器的logging,加大他的File read cache size,加大容器的線程數(shù),禁止servlet的重新加載。
9.優(yōu)化jvm,加大heap的初始化字節(jié)數(shù),降低虛擬機(jī)的垃圾回收頻率,