久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

Java程序員常犯的錯誤

時間:2019-05-14 15:58:37下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《Java程序員常犯的錯誤》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《Java程序員常犯的錯誤》。

第一篇:Java程序員常犯的錯誤

Java程序員常犯的十大錯誤

無論你是一名熟練的java程序員,熟悉java的程度就像熟悉自己的手背一樣;或者你是一名java新手,你都會犯錯誤。這是很自然的,更是人之常情。你所想象不到的確實,你犯的錯誤很可能是其他人也在犯的錯誤,這些錯誤犯了一次又一次。在這里我給出來了經(jīng)常犯的十大錯誤列表,通過它我們可以發(fā)現(xiàn)它們并解決它們。

10.在靜態(tài)方法中訪問非靜態(tài)的成員變量(例如在main方法中)。

許多程序員,特別是那些剛剛接觸JAVA的,都有一個問題,就是在main方法中訪問成員變量。Main方法一般都被標(biāo)示為“靜態(tài)的”,意思就是我們不需要實例化這個類來調(diào)用main方法。例如,java虛擬機(jī)能夠以這樣的形式來調(diào)用MyApplication類:

MyApplication.main(命令行參數(shù));

這里并沒有實例化MyApplication類,或者這里沒有訪問任何的成員變量。例如下面的程序就會產(chǎn)生一個編譯器的錯誤。

public class StaticDemo {

public String my_member_variable = “somedata”;public static void main(String args[]){

// Access a non-static member from static method

System.out.println(“This generates a compiler error” + my_member_variable);} }

如果你要訪問一個靜態(tài)方法中的成員變量(比如main方法),你就需要實例化一個對象。下面這段代碼示例了如何正確的訪問一個非靜態(tài)的成員變量,其方法就是首先實例化一個對象。

public class NonStaticDemo {

public String my_member_variable = “somedata”;

public static void main(String args[]){

NonStaticDemo demo = new NonStaticDemo();

// Access member variable of demo

System.out.println(“This WON'T generate an error” + demo.my_member_variable);} }

9.在重載的時候錯誤的鍵入方法名

重載允許程序員用新的代碼去覆蓋方法的實現(xiàn)。重載是一個便利的特性,很多面對對象的程序員都在大量的使用它。如果你使用AWT1.1的事件處理模型,你通常會覆蓋listener方法去實現(xiàn)定制的功能。一個在重載方法的時候很容易犯的錯誤就是錯誤的鍵入要重載的方法名。如果你錯誤的輸入了方法名,你就不是在重載這個方法了。相反的,你是在重新定義一個方法,只不過這個方法的參數(shù)和返回類型和你要重載的方法相同罷了。

public class MyWindowListener extends WindowAdapter { // This should be WindowClosed

public void WindowClose(WindowEvent e){ // Exit when user closes window System.exit(0);} };

這 個方法不會通過編譯,很容易就能捕捉找它。在過去我曾經(jīng)注意過一個方法,并且相信它是被調(diào)用的,花了很多時間找這個錯誤。這個錯誤的表現(xiàn)就是你的方法不會 被調(diào)用,你會以為你的方法已經(jīng)被跳過了。一種可行的解決方法就是增加一條打印輸出語句。在日志文件中記錄下信息。或者是使用跟蹤調(diào)試程序(例如VJ++或者是Borland JBuilder)來一行一行的調(diào)試。如果你的方法還不能被調(diào)用,那很可能就是你的方法名鍵入錯誤了。

8.比較和分配(“=”強(qiáng)于“==”)

這是一個很容易犯的錯誤。如果你以前使用過別的語言,比如Pascal,你就會知道計算機(jī)語言的設(shè)計們選擇這樣的方式是何等的乏味。舉個例子,在Pascal中,我們使用:=運(yùn)算符來表示分配,而使用=來表示比較。這樣好像是退回了C/C++,也就是java的起源。

幸運(yùn)的是,即使你沒有發(fā)現(xiàn)在屏幕上發(fā)現(xiàn)這個錯誤,你的編譯器會幫助你發(fā)現(xiàn)它。通常情況下,編譯器會報出這樣一個錯誤信息:“不能轉(zhuǎn)換xxx到布爾類型”,這里的XXX是你用來代替比較的java類型。

7.比較兩個對象(用==來代替instead of)當(dāng)我們使用==運(yùn)算符的時候,我們實際上是在比較兩個對象的引用,來看看他們是不是指向的同一個對象。舉個例子,我們不能使用==運(yùn)算符來比較兩個字符串是否相等。我們應(yīng)該使用.equals方法來比較兩個對象,這個方法是所有類共有的,它繼承自java.lang.Object。

下面是比較兩個字符串相等的正確的方法。

// Bad way

if((abc + def)== “abcdef”){

......}

// Good way

if((abc + def).equals(“abcdef”)){

.....}

6.混淆值傳遞和引用傳遞。

這是一個不太容易發(fā)現(xiàn)的錯誤。因為,當(dāng)你看代碼的時候,你會十分確定這是一個引用傳遞,而它實際上卻是一個值傳遞。Java這兩者都會使用,所以你要理解你什么時候需要值傳遞,什么時候需要引用傳遞。當(dāng)你要傳遞一個簡單的數(shù)據(jù)類型到一個函數(shù)中,比如,char、int、float或者double,你是在傳遞一個值。這個意味著這種數(shù)據(jù)類型的被復(fù)制了一個拷貝,是這個拷貝被傳遞到了函數(shù)中。如果這個函數(shù)去修改這個值,僅僅是這個值的拷貝被修改了。這個函數(shù)結(jié)束以后,將會返回到控制調(diào)用函數(shù)去,這時候那個“真正的”值沒有受到影響,沒有任何改變被存儲。

如果你想修改一個簡單的數(shù)據(jù)類型,可以將這個數(shù)據(jù)類型定位一個返回值或者將它封裝到一個對象中。

當(dāng)你要傳遞一個java對 象到一個函數(shù)中,比如,數(shù)組、向量或者是一個字符串,此時你傳遞的就是一個對象的引用。這里的字符串也是一個對象,而不是一個簡單數(shù)據(jù)類型。這就意味這你 要傳遞一個對象到一個函數(shù),你就要傳遞這個對象的引用,而不能去復(fù)制它。任何對這個對象的成員變量的改變都會持久化,這種改變的好壞要取決于你是否是刻意 而為之。

有一點要注意,如果字符串沒有包含任何方法改變它的值的時候,你最好將它作為值來傳遞。

5.寫一個空的異常處理。

我知道一個空的異常處理就像忽略錯誤一樣很誘人。但是如果真的發(fā)生了錯誤,你不會得到一個錯誤信息的輸出,它使得不太可能發(fā)現(xiàn)錯誤的原因。甚至是最簡單的異常處理都是很有用處的。舉個例子,在你的代碼加上try{}catch{},去試著捕捉任何的異常拋出,并打印出錯誤信息。你不用為每個異常都寫出定制的處理(雖然這是一個很好的編程習(xí)慣)。但是不要將這個異常處理空著,否則你就不會知道有什么錯誤發(fā)生了。

舉例:

public static void main(String args[]){

try {

// Your code goes here..}

catch(Exception e){

System.out.println(“Err-” + e);} }

4.忘記java中索引是從0開始的。

如果你有C/C++的編程背景的話,你在使用其他編程語言的時候就不會發(fā)現(xiàn)同樣的問題了。

在java中數(shù)組的索引是從0開始的,這就是說第一個元素的索引必須是0.困惑了?讓我們看看例子吧。

// Create an array of three strings String[] strArray = new String[3];

// First element's index is actually 0 strArray[0] = “First string”;

// Second element's index is actually 1 strArray[1] = “Second string”;

// Final element's index is actually 2 strArray[2] = “Third and final string”;

在這個例子中,我們定義了一個有著三個字符串的數(shù)組,當(dāng)我們訪問它的元素時候減去了一個。現(xiàn)在,當(dāng)我們試著去訪問strArray[3],也就是第四個元素的時候,就會有一個ArrayOutOfBoundsException異常被拋出。這個就是最明顯的例子-忘記了0索引規(guī)則。

在其他地方0索引規(guī)則也能使你陷入麻煩。例如字符串中。假設(shè)你要從一個字符串確定的偏移位置處得到一個字符,使用String.charAt(int)函數(shù),你就能看到這個信息。但是在java中,字符串類的索引也是從0開始的,這就是說第一個字符的偏移位置為0,第二個為1.你可能會陷入一些麻煩,如果你不注意這個問題的話,特別是你的應(yīng)用程序中使用了大量的字符串處理程序,那樣的話你就很可能使用錯誤的字符,同時在運(yùn)行是拋出一個StringIndexOutOfBoundsException異常,就像ArrayOutOfBoundsException異常一樣。下面的例子證明了這些:

public class StrDemo {

public static void main(String args[]){

String abc = “abc”;

System.out.println(“Char at offset 0 : ” + abc.charAt(0));System.out.println(“Char at offset 1 : ” + abc.charAt(1));System.out.println(“Char at offset 2 : ” + abc.charAt(2));

// This line should throw a StringIndexOutOfBoundsException System.out.println(“Char at offset 3 : ” + abc.charAt(3));} }

同時應(yīng)該注意的是,0索引規(guī)則不應(yīng)該只應(yīng)用在數(shù)組或是字符串中,java的其他部分也會用到。但是并不是全部都會用到。Java.util.Date和java.util.Calendar,這兩個類的月份都是從0開始的,但是日期卻通常是從1開始的,下面的程序證明了這一點。

import java.util.Date;import java.util.Calendar;

public class ZeroIndexedDate {

public static void main(String args[]){

// Get today's date Date today = new Date();

// Print return value of getMonth

System.out.println(“Date.getMonth()returns : ” + today.getMonth());

// Get today's date using a Calendar

Calendar rightNow = Calendar.getInstance();

// Print return value of get(Calendar.MONTH)

System.out.println(“Calendar.get(month)returns : ” + rightNow.get(Calendar.MONTH));} }

0索引規(guī)則在你不注意它的時候就會發(fā)生,如果你不想在運(yùn)行時遇到這個錯誤的話,請注意查閱你的API文檔。

3.防止線程在共享變量中并行存取。

在寫一個多線程的應(yīng)用程序的時候,許多程序員都喜歡抄近路。而這樣會是他們的應(yīng)用程序或者是小應(yīng)用程序發(fā)生線程沖突。當(dāng)兩個或者兩個以上的線程訪問同一個數(shù)據(jù)的時候,就存在一定的概率(概率大小取決與墨菲法則)使得兩個線程同時的訪問或者修改同一個數(shù)據(jù)。不要愚蠢的認(rèn)為這樣的情況不會發(fā)生在單線程的應(yīng)用程序中。當(dāng)訪問同一個數(shù)據(jù)的時候,你的線程就很可能被掛起,而第二個線程進(jìn)入是就會覆蓋第一個線程修改的地方。

這樣的問題不是僅僅出現(xiàn)在多線程應(yīng)用程序或者是小應(yīng)用程序中的。如果你寫了java api或者是java bean,你的代碼就很可能不是線程安全的。即使你從來沒有寫過一個使用線程的單獨(dú)的應(yīng)用程序,人們也有可能使用你的程序。為了其他人,不僅僅是你,你就應(yīng)該采取措施防止線程在共享變量中并行存取。

怎樣來解決這個問題呢,最簡單的就是讓你的變量私有化。同時使用同步存取方法。存取方法允許訪問似有的成員變量,但是僅僅是在一種控制方式中。下面的存取方法就能夠以安全的方式修改計數(shù)器的值。

public class MyCounter {

private int count = 0;// count starts at zero

public synchronized void setCount(int amount){

count = amount;}

public synchronized int getCount(){

return count;} } 2.大寫錯誤。

這是一個我們最經(jīng)常犯的錯誤。它是很簡單的,但是有時我們看著一個沒有大寫的變量或者方法卻并不能發(fā)現(xiàn)這個錯誤。我自己也常常感到困惑,因為我認(rèn)為這些方法和變量都是存在的,但是卻發(fā)現(xiàn)不了他們沒有大寫。

這里你不能用銀子彈來檢查它,你只能自己訓(xùn)練著來減少這種錯誤。這里有一個竅門:

Java api中所用的方法和變量名都應(yīng)該以小寫字母來開頭。所有的變量名和方法名的新詞的開頭都要用大寫字母。如果你以這樣的形式來定義你的變量名和類名,你就是在有意識的使它們走向正確,你就能逐漸的減少這樣錯誤的數(shù)量。這可能需要一段時間,但是在以后有可能會避免更為嚴(yán)重的錯誤。

下來就是java程序員最常犯的錯誤了!!1.空指針!

空指針是java程序員最經(jīng)常犯的錯誤了。編譯器不會為你檢查出這個錯誤它僅僅在運(yùn)行時在表現(xiàn)出來,如果你發(fā)現(xiàn)不了它,你的用戶將很可能發(fā)現(xiàn)它。

當(dāng)試著訪問一個對象的時候,這個對象的引用就是空的,一個NullPointerException異常就會被拋出。空指針錯誤的原因是多種多樣的,但是一般情況下發(fā)生這種錯誤意味著你沒有對一個對象初始化,或者是你沒有檢查一個函數(shù)的返回值。

許多函數(shù)返回一個空是用來指示一個錯誤的條件被執(zhí)行。如果你不檢查返回值的話,你由于不可能知道發(fā)生了什么。既然原因是一個錯誤的條件,一般的測試就不會發(fā)現(xiàn)它,這就意味著你的用戶可能在最后的時候替你發(fā)現(xiàn)它。如果API函數(shù)指明一個空的對象很可能被返回,那在使用對象的引用之前一定要進(jìn)行檢查。

另外的原因可能是你在初始化對象的時候不規(guī)范,或者是它的初始化是有條件的。舉例,檢查下面的代碼,看看你是否能發(fā)現(xiàn)這個錯誤。

public static void main(String args[]){

// Accept up to 3 parameters String[] list = new String[3];

int index = 0;

while((index < args.length)&&(index < 3)){

list[index++] = args[index];}

// Check all the parameters

for(int i = 0;i < list.length;i++){

if(list[i].equals “-help”){ //.........} else

if(list[i].equals “-cp”){

//.........}

// else.....} }

上面的代碼(作為人為的例子),顯示了通常的錯誤。在某些情況下,用戶輸入了三個或者更多的參數(shù),上述代碼將會正常運(yùn)行。但是如果沒有參數(shù)被輸入,那么在運(yùn)行的時候就會得到一個空指針異 常。某些時候你的變量將會被初始化,但是其他時候它們卻不會。一個簡單的解決辦法就是在你訪問數(shù)組元素的時候先檢查它十分為空。

總結(jié):

這些錯誤是我們常犯的錯誤的一些代表。雖然在編碼的時候不可能完全的避免錯誤,但是你應(yīng)該去避免犯一些重復(fù)的錯誤。很明顯的是,所有的java程序員都會犯這樣的錯誤。唯一能讓人感到安慰的就是,當(dāng)你在夜深人靜的時候去跟蹤一個錯誤,在某時某地某個人也在犯著同樣的錯誤。

第二篇:Java程序員在寫SQL程序時候常犯的10個錯誤

Java程序員編程時需要混合面向?qū)ο笏季S和一般命令式編程的方法,能否完美的將兩者結(jié)合起來完全得依靠編程人員的水準(zhǔn): 技能(任何人都能容易學(xué)會命令式編程)模式(有些人用“模式-模式”,舉個例子,模式可以應(yīng)用到任何地方,而且都可以歸為某一類模式)心境(首先,要寫個好的面向?qū)ο蟪绦蚴潜让钍匠绦螂y的多,你得花費(fèi)一些功夫)但當(dāng)Java程序員寫SQL語句時,一切都不一樣了。SQL是說明性語言而非面向?qū)ο蠡蚴敲钍骄幊陶Z言。在SQL中要寫個查詢語句是很簡單的。但在Java里類似的語句卻不容易,因為程序員不僅要反復(fù)考慮編程范式,而且也要考慮算法的問題。

下面是Java程序員在寫SQL時常犯的錯誤(沒有特定的順序): 1.忘掉NULL

Java程序員寫SQL時對NULL的誤解可能是最大的錯誤。也許是因為(并非唯一理由)NULL也稱作UNKNOWN。如果被稱作UNKNOWN,這還好理解些。另一個原因是,當(dāng)你從數(shù)據(jù)庫拿東西或是綁定變量時,JDBC將SQL NULL 和Java中的null對應(yīng)了起來。這樣導(dǎo)致了NULL = NULL(SQL)和null=null(Java)的誤解。

對于NULL最大的誤解是當(dāng)NULL被用作行值表達(dá)式完整性約束條件時。

另一個誤解出現(xiàn)在對于NULL 在 NOT IN anti-joins的應(yīng)用中。解決方法: 好好的訓(xùn)練你自己。當(dāng)你寫SQL時要不停得想到NULL的用法: 這個NULL完整性約束條件是正確的? NULL是否影響到結(jié)果? 2.在Java內(nèi)存中處理數(shù)據(jù)

很少有Java開發(fā)者能將SQL理解的很好.偶爾使用的JOIN,還有古怪的UNION,好吧.但是對于窗口函數(shù)呢?還有對集合進(jìn)行分組呢?許多的Java開發(fā)者將SQL數(shù)據(jù)加載到內(nèi)存中,將這些數(shù)據(jù)轉(zhuǎn)換成某些相近的集合類型,然后再那些集合上面使用邊界循環(huán)控制結(jié)構(gòu)(至少在Java8的集合升級以前)執(zhí)行令人生厭的數(shù)學(xué)運(yùn)算.但是一些SQL數(shù)據(jù)庫支持先進(jìn)的(而且是SQL 標(biāo)準(zhǔn)支持的!)OLAP特性,這一特性表現(xiàn)更好而且寫起來也更加方便.一個(并不怎么標(biāo)準(zhǔn)的)例子就是Oracle超棒的MODEL分句.只讓數(shù)據(jù)庫來做處理然后只把結(jié)果帶到Java內(nèi)存中吧.因為畢竟所有非常聰明的家伙已經(jīng)對這些昂貴的產(chǎn)品進(jìn)行了優(yōu)化.因此實際上,通過將OLAP移到數(shù)據(jù)庫,你將獲得一下兩項好處: 便利性.這比在Java中編寫正確的SQL可能更加的容易.性能表現(xiàn).數(shù)據(jù)庫應(yīng)該比你的算法處理起來更加快.而且更加重要的是,你不必再去傳遞數(shù)百萬條記錄了.完善的方法: 每次你使用Java實現(xiàn)一個以數(shù)據(jù)為中心的算法時,問問自己:有沒有一種方法可以讓數(shù)據(jù)庫代替為我做這種麻煩事.3.使用UNION代替UNION ALL 太可恥了,和UNION相比UNION ALL還需要額外的關(guān)鍵字。如果SQL標(biāo)準(zhǔn)已經(jīng)規(guī)定了支持,那么可能會更好點。UNION(允許重復(fù))UNION DISTINCT(去除了重復(fù))移除重復(fù)行不僅很少需要(有時甚至是錯的),而且對于帶很多行的大數(shù)據(jù)集合會相當(dāng)慢,因為兩個子select需要排序,而且每個元組也需要和它的子序列元組比較。

注意即使SQL標(biāo)準(zhǔn)規(guī)定了INTERSECT ALL和EXCEPT ALL,很少數(shù)據(jù)庫會實現(xiàn)這些沒用的集合操作符。處理方法:

每次你寫UNION語句時,考慮實際上是否需要UNION ALL語句。4.通過JDBC分頁技術(shù)給大量的結(jié)果進(jìn)行分頁操作

大部分的數(shù)據(jù)庫都會支持一些分頁命令實現(xiàn)分頁效果,譬如LIMIT..OFFSET,TOP..START AT,OFFSET..FETCH語句等。即使沒有支持這些語句的數(shù)據(jù)庫,仍有可能對ROWNUM(甲骨文)或者是ROW NUMBER()OVER()過濾(DB2,SQL Server2008等),這些比在內(nèi)存中實現(xiàn)分頁更快速。在處理大量數(shù)據(jù)中,效果尤其明顯。糾正:

僅僅使用這些語句,那么一個工具(例如JOOQ)就可以模擬這些語句的操作。

5.在java內(nèi)存中加入數(shù)據(jù) 從SQL的初期開始,當(dāng)在SQL中使用JOIN語句時,一些開發(fā)者仍舊有不安的感覺。這是源自對加入JOIN后會變慢的固有恐懼。假如基于成本的優(yōu)化選擇去實現(xiàn)嵌套循環(huán),在創(chuàng)建一張連接表源前,可能加載所有的表在數(shù)據(jù)庫內(nèi)存中,這可能是真的。但是這事發(fā)生的概率太低了。通過合適的預(yù)測,約束和索引,合并連接和哈希連接的操作都是相當(dāng)?shù)目臁_@完全是是關(guān)于正確元數(shù)據(jù)(在這里我不能夠引用Tom Kyte的太多)。而且,可能仍然有不少的Java開發(fā)人員加載兩張表通過分開查詢到一個映射中,并且在某種程度上把他們加到了內(nèi)存當(dāng)中。糾正:

假如你在各個步驟中有從各種表的查詢操作,好好想想是否可以表達(dá)你的查詢操作在單條語句中。

6.在一個臨時的笛卡爾積集合中使用 DISTINCT 或 UNION 消除重復(fù)項

通過復(fù)雜的連接,人們可能會對SQL語句中扮演關(guān)鍵角色的所有關(guān)系失去概念。特別的,如果這涉及到多列外鍵關(guān)系的話,很有可能會忘記在JOIN..ON子句中增加相關(guān)的判斷。這會導(dǎo)致重復(fù)的記錄,但或許只是在特殊的情況下。有些開發(fā)者因此可能選擇DISTINCT來消除這些重復(fù)記錄。從三個方面來說這是錯誤的:

它(也許)解決了表面癥狀但并沒有解決問題。它也有可能無法解決極端情況下的癥狀。

對具有很多列的龐大的結(jié)果集合來說它很慢。DISTINCT要執(zhí)行ORDER BY操作來消除重復(fù)。對龐大的笛卡爾積集合來說它很慢,還是需要加載很多的數(shù)據(jù)到內(nèi)存中。解決方法: 根據(jù)經(jīng)驗,如果你獲得了不需要的重復(fù)記錄,還是檢查你的JOIN判斷吧。可能在某個地方有一個很難覺察的笛卡爾積集合。7.不使用MERGE語句

這并不是一個過失,但是可能是缺少知識或者對于強(qiáng)悍的MERGE語句信心不足。一些數(shù)據(jù)庫理解其它形式的更新插入(UPSERT)語句,如 MYSQL的重復(fù)主鍵更新語句,但是MERGE在數(shù)據(jù)庫中確是很強(qiáng)大,很重要,以至于大肆擴(kuò)展SQL標(biāo)準(zhǔn),例如SQL SERVER。解決之道: 如果你使用像聯(lián)合INSERT和UPDATE或者聯(lián)合SELECT..FOR UPDATE然后在INSERT或UPDATE等更新插入時,請三思。你完全可以使用一個更簡單的MERGE語句來遠(yuǎn)離冒險競爭條件。8.使用聚合函數(shù)代替窗口函數(shù)(window functions)

在介紹窗口函數(shù)之前,在SQL中聚合數(shù)據(jù)意味著使用GROUP BY語句與聚合函數(shù)相映射。在很多情形下都工作得很好,如聚合數(shù)據(jù)需要濃縮常規(guī)數(shù)據(jù),那么就在join子查詢中使用group查詢。

但是在SQL:2003中定義了窗口函數(shù),這個在很多主流數(shù)據(jù)庫都實現(xiàn)了它。窗口函數(shù)能夠在結(jié)果集上聚合數(shù)據(jù),但是卻沒有分組。事實上,每個窗口函數(shù)都有自己的、獨(dú)立的PARTITION BY語句,這個工具對于顯示報告太TM好了。使用窗口函數(shù): 使SQL更易讀(但在子查詢中沒有GROUP BY語句專業(yè))提升性能,像關(guān)系數(shù)據(jù)庫管理系統(tǒng)能夠更容易優(yōu)化窗口函數(shù) 解決方法:

當(dāng)你在子查詢中使用GROUP BY語句時,請再三考慮是否可以使用窗口函數(shù)完成。9.使用內(nèi)存間接排序

SQL的ORDER BY語句支持很多類型的表達(dá)式,包括CASE語句,對于間接排序十分有用。你可能重來不會在Java內(nèi)存中排序數(shù)據(jù),因為你會想: SQL排序很慢 SQL排序辦不到 處理方法: 如果你在內(nèi)存中排序任何SQL數(shù)據(jù),請再三考慮,是否不能在數(shù)據(jù)庫中排序。這對于數(shù)據(jù)庫分頁數(shù)據(jù)十分有用。10.一條一條的插入大量紀(jì)錄

JDBC ”懂“批處理(batch),你應(yīng)該不會忘了它。不要使用INSERT語句來一條一條的出入成千上萬的記錄,(因為)每次都會創(chuàng)建一個新的PreparedStatement對象。如果你的所有記錄都插入到同一個表時,那么就創(chuàng)建一個帶有一條SQL語句以及附帶很多值集合的插入批處理語句。你可能需要在達(dá)到一定量的插入記錄后才提交來保證UNDO日志瘦小,這依賴于你的數(shù)據(jù)庫和數(shù)據(jù)庫設(shè)置。處理方法: 總是使用批處理插入大量數(shù)據(jù)。

第三篇:php程序員最常犯的11個MySQL錯誤

中國IT職業(yè)教育領(lǐng)先品牌

精品課程 全程面授

php程序員最常犯的11個MySQL錯誤

千鋒PHP培訓(xùn)簡歷制作課,意在針對人事審核簡歷的幾個關(guān)鍵點,告訴學(xué)員具體關(guān)鍵點怎么寫,不同關(guān)鍵點,對應(yīng)的面試機(jī)會。今天將為大家介紹一下11個MySQL常犯的錯誤。

對于大多數(shù)web應(yīng)用來說,數(shù)據(jù)庫都是一個十分基礎(chǔ)性的部分。如果你在使用PHP,那么你很可能也在使用MySQL—LAMP系列中舉足輕重的一份子。

對于很多新手們來說,使用PHP可以在短短幾個小時之內(nèi)輕松地寫出具有特定功能的代碼。但是,構(gòu)建一個穩(wěn)定可靠的數(shù)據(jù)庫卻需要花上一些時日和相關(guān)技能。下面列舉了我曾經(jīng)犯過的最嚴(yán)重的11個MySQL相關(guān)的錯誤(有些同樣也反映在其他語言/數(shù)據(jù)庫的使用上)。

1.使用MyISAM而不是InnoDB MySQL有很多數(shù)據(jù)庫引擎,但是你最可能碰到的就是MyISAM和InnoDB。MySQL默認(rèn)使用的是MyISAM。但是,很多情況下這都是一個很糟糕的選擇,除非你在創(chuàng)建一個非常簡單抑或?qū)嶒炐缘臄?shù)據(jù)庫。外鍵約束或者事務(wù)處理對于數(shù)據(jù)完整性是非常重要的,但MyISAM都不支持這些。另外,當(dāng)有一條記錄在插入或者更新時,整個數(shù)據(jù)表都被鎖定了,當(dāng)使用量增加的時候這會產(chǎn)生非常差的運(yùn)行效率。

結(jié)論很簡單:使用InnoDB。2.使用PHP的mysql函數(shù)

PHP自產(chǎn)生之日就提供了MySQL庫函數(shù)(or near as makes no difference)。很多應(yīng)用仍然在使用類似mysql_connect、mysql_query、mysql_fetch_assoc等的函數(shù),盡管PHP手冊上說:

千鋒教育www.tmdps.cn

中國IT職業(yè)教育領(lǐng)先品牌

精品課程 全程面授

如果你在使用MySQL v4.1.3或者更新版本,強(qiáng)烈推薦使用您使用mysqli擴(kuò)展。

mysqli(MySQL 的加強(qiáng)版擴(kuò)展)有以下幾個優(yōu)點: 可選的面向?qū)ο蠼涌?/p>

prepared表達(dá)式,這有利于阻止SQL注入攻擊,還能提高性能 支持更多的表達(dá)式和事務(wù)處理

另外,如果你想支持多種數(shù)據(jù)庫系統(tǒng),你還可以考慮PDO。3.沒有處理用戶輸入

這或者可以這樣說#1:永遠(yuǎn)不要相信用戶的輸入。用服務(wù)器端的PHP驗證每個字符串,不要寄希望與JavaScript。最簡單的SQL注入攻擊會利用如下的代碼:

$username = $_POST[“name”];$password = $_POST[“password”];$sql = “SELECT userid FROM usertable WHERE username=’$username’ AND password=’$password’;”;// run query…

只要在username字段輸入”admin’;–”,這樣就會被黑到,相應(yīng)的SQL語句如下:

SELECT userid FROM usertable WHERE username=’admin’;狡猾的黑客可以以admin登錄,他們不需要知道密碼,因為密碼段被注釋掉了。

4.沒有使用UTF-8

千鋒教育www.tmdps.cn

中國IT職業(yè)教育領(lǐng)先品牌

精品課程 全程面授

美國、英國和澳大利亞的我們很少考慮除英語之外的其他語言。我們很得意地完成了自己的”杰作”卻發(fā)現(xiàn)它們并不能在其他地方正常運(yùn)行。

UTF-8解決了很多國際化問題。雖然在PHP v6.0之前它還不能很好地被支持,但這并不影響你把MySQL字符集設(shè)為UTF-8。

5.相對于SQL,偏愛PHP 如果你接觸 MySQL不久,那么你會偏向于使用你已經(jīng)掌握的語言來解決問題,這樣會導(dǎo)致寫出一些冗余、低效率的代碼。比如,你不會使用MySQL自帶的AVG()函數(shù),卻會先對記錄集中的值求和然后用PHP循環(huán)來計算平均值。

此外,請注意PHP循環(huán)中的SQL查詢。通常來說,執(zhí)行一個查詢比在結(jié)果中迭代更有效率。

所以,在分析數(shù)據(jù)的時候請利用數(shù)據(jù)庫系統(tǒng)的優(yōu)勢,懂一些SQL的知識將大有裨益。

6.沒有優(yōu)化數(shù)據(jù)庫查詢

99%的PHP性能問題都是由數(shù)據(jù)庫引起的,僅僅一個糟糕的SQL查詢就能讓你的web應(yīng)用徹底癱瘓。MySQL的EXPLAIN statement、Query Profiler,還有很多其他的工具將會幫助你找出這些萬惡的SELECT。

7.不能正確使用數(shù)據(jù)類型

MySQL 提供了諸如numeric、string和date等的數(shù)據(jù)類型。如果你想存儲一個時間,那么使用DATE或者DATETIME類型。如果這個時候用INTEGER或者STRING類型的話,那么將會使得SQL查詢非常復(fù)雜,前提是你能使用INTEGER或者STRING來定義那個類型。

很多人傾向于擅自自定義一些數(shù)據(jù)的格式,比如,使用string來存儲序列

千鋒教育www.tmdps.cn

中國IT職業(yè)教育領(lǐng)先品牌

精品課程 全程面授

化的PHP對象。這樣的話數(shù)據(jù)庫管理起來可能會變得簡單些,但會使得MySQL成為一個糟糕的數(shù)據(jù)存儲而且之后很可能會引起故障。

8.在查詢中使用* 永遠(yuǎn)不要使用*來返回一個數(shù)據(jù)表所有列的數(shù)據(jù)。這是懶惰:你應(yīng)該提取你需要的數(shù)據(jù)。就算你需要所有字段,你的數(shù)據(jù)表也不可避免的會產(chǎn)生變化。

9.不使用索引或者過度使用索引

一般性原則是這樣的:select語句中的任何一個where子句表示的字段都應(yīng)該使用索引。

舉個例子,假設(shè)我們有一個user表,包括numeric ID(主鍵)和email address。登錄的時候,MySQL 必須以一個email為依據(jù)查找正確的ID。如果使用了索引的話(這里指email),那么MySQL就能夠使用更快的搜索算法來定位email,甚至可以說是即時實現(xiàn)。否則,MySQL就只能順序地檢查每一條記錄直到找到正確的email address。

有的人會在每個字段上都添加索引,遺憾的是,執(zhí)行了INSERT或者UPDATE之后這些索引都需要重新生成,這樣就會影響性能。所以,只在需要的時候添加索引。

10.忘記備份

雖然比較罕見,但是數(shù)據(jù)庫還是有崩潰的危險。硬盤有可能損壞,服務(wù)器有可能崩潰,web主機(jī)提供商有可能會破產(chǎn)!丟失MySQL數(shù)據(jù)將會是災(zāi)難性的,所以請確保你已經(jīng)使用了自動備份或者已經(jīng)復(fù)制到位。

11.Bonus mistake-不考慮使用其他數(shù)據(jù)庫

對于PHP開發(fā)人員來說,MySQL 可能是使用最廣泛的數(shù)據(jù)庫系統(tǒng),但并

千鋒教育www.tmdps.cn

中國IT職業(yè)教育領(lǐng)先品牌

精品課程 全程面授

不是唯一的選擇。PostgreSQL和Firebird是最強(qiáng)有力的競爭者:這個兩者都是開源的,而且都沒有被公司收購。微軟提供了sql server Express,甲骨文提供了10g Express,這兩者都是企業(yè)級數(shù)據(jù)庫的免費(fèi)版本。有時候,對于一個較小的web應(yīng)用或者嵌入式應(yīng)用,SQLite也不失為一個可行的替代方案。

以上就是為大家介紹的php程序員最常犯的11個MySQL錯誤,希望能對大家有所幫助。

千鋒教育www.tmdps.cn

第四篇:求職信常犯錯誤

常犯錯誤:有些人在工作數(shù)年后,會抽身全職進(jìn)修,之后一年未有工作做,但當(dāng)

求職時,履歷表卻漏寫了待業(yè)的資料。

1)開始部分,包括:標(biāo)題,姓名,年齡,學(xué)歷,婚姻狀況,健康情況,聯(lián)系地址,求職目標(biāo)等。

求職目標(biāo)要結(jié)合自己的實際情況去選擇職業(yè)目標(biāo),應(yīng)該考慮的因素有:專業(yè)特長

;興趣;待遇;能力;學(xué)歷;年齡;性別;性格;愛好等。(其中興趣與待遇最為重

要)。對于特別熱門、應(yīng)聘人特別多的職業(yè),選擇要謹(jǐn)慎行事。簡歷中職業(yè)目標(biāo)的寫

法:工作目標(biāo)書寫的字?jǐn)?shù)簡練清楚,最好不要超過四十個字。

2)中間部分,主要陳述個人的求職資格和所具備的能力。

A、專業(yè) 包括自己所學(xué)的專業(yè)和業(yè)余所學(xué)的專業(yè)及特長;具體所學(xué)的課程等;自

己所受教育的階段;教育背景的陳述,要突出與招聘工作密切相關(guān)的內(nèi)容。

B、工作經(jīng)歷和能力 說明工作經(jīng)歷,尤其是與求職目標(biāo)相關(guān)的經(jīng)歷,一定要說出

最主要,最有說服力的資力、能力和工作經(jīng)歷;說明的語氣要肯定、積極、有力。寫

工作經(jīng)驗時,一般是由近及遠(yuǎn)先寫近期的,然后按照年代的順序依次寫出。最近的工

作經(jīng)驗是很重要的。在每一項工作經(jīng)歷中先寫工作日期,接著是單位和職務(wù)。在這個

部分需要注意的一點是,陳述個人的資格和能力經(jīng)歷之后,不要太提及個人的需求、理想等。

3)結(jié)尾部分,多是提供證明自己資歷、能力以及工作經(jīng)歷的證明材料,其中也

包括自己的一些補(bǔ)充。例如學(xué)歷證明、學(xué)術(shù)論文、獲獎證明證書、專業(yè)技術(shù)職業(yè)證書、專家教授推薦信等。這些可以列在另外的附頁上。

第五篇:總結(jié)PHP程序員最常犯的11個MySQL錯誤

總結(jié)PHP程序員最常犯的11個MySQL錯誤

對于大多數(shù)web應(yīng)用來說,數(shù)據(jù)庫都是一個十分基礎(chǔ)性的部分。如果你在使用PHP,那么你很可能也在使用MySQL—LAMP系列中舉足輕重的一份子。

對于很多新手們來說,使用PHP可以在短短幾個小時之內(nèi)輕松地寫出具有特定功能的代碼。但是,構(gòu)建一個穩(wěn)定可靠的數(shù)據(jù)庫卻需要花上一些時日和相關(guān)技能。下面列舉了我曾經(jīng)犯過的最嚴(yán)重的11個MySQL相關(guān)的錯誤(有些同樣也反映在其他語言/數(shù)據(jù)庫的使用上)。。

1、使用MyISAM而不是InnoDB

MySQL有很多數(shù)據(jù)庫引擎,但是你最可能碰到的就是MyISAM和InnoDB。

MySQL 默認(rèn)使用的是MyISAM。但是,很多情況下這都是一個很糟糕的選擇,除非你在創(chuàng)建一個非常簡單抑或?qū)嶒炐缘臄?shù)據(jù)庫。外鍵約束或者事務(wù)處理對于數(shù)據(jù)完整性 是非常重要的,但MyISAM都不支持這些。另外,當(dāng)有一條記錄在插入或者更新時,整個數(shù)據(jù)表都被鎖定了,當(dāng)使用量增加的時候這會產(chǎn)生非常差的運(yùn)行效率。

結(jié)論很簡單:使用InnoDB。

2、使用PHP的mysql函數(shù)

PHP自產(chǎn)生之日就提供了MySQL庫函數(shù)(or near as makes no difference)。很多應(yīng)用仍然在使用類似mysql_connect、mysql_query、mysql_fetch_assoc等的函數(shù),盡管PHP手冊上說:

如果你在使用MySQL v4.1.3或者更新版本,強(qiáng)烈推薦使用您使用mysqli擴(kuò)展。

mysqli(MySQL的加強(qiáng)版擴(kuò)展)有以下幾個優(yōu)點:

可選的面向?qū)ο蠼涌?/p>

prepared表達(dá)式,這有利于阻止SQL注入攻擊,還能提高性能

支持更多的表達(dá)式和事務(wù)處理

另外,如果你想支持多種數(shù)據(jù)庫系統(tǒng),你還可以考慮PDO。

3、沒有處理用戶輸入

這或者可以這樣說#1:永遠(yuǎn)不要相信用戶的輸入。用服務(wù)器端的PHP驗證每個字符串,不要寄希望與JavaScript。最簡單的SQL注入攻擊會利用如下的代碼:

$username = $_POST[“name”];$password = $_POST[“password”];$sql = “SELECT userid FROM usertable WHERE username='$username' AND password='$password';”;// run query...只要在username字段輸入“admin';--”,這樣就會被黑到,相應(yīng)的SQL語句如下:

SELECT userid FROM usertable WHERE username='admin';

狡猾的黑客可以以admin登錄,他們不需要知道密碼,因為密碼段被注釋掉了。

4、沒有使用UTF-8

美國、英國和澳大利亞的我們很少考慮除英語之外的其他語言。我們很得意地完成了自己的“杰作”卻發(fā)現(xiàn)它們并不能在其他地方正常運(yùn)行。

UTF-8解決了很多國際化問題。雖然在PHP v6.0之前它還不能很好地被支持,但這并不影響你把MySQL字符集設(shè)為UTF-8。

5、相對于SQL,偏愛PHP

如果你接觸MySQL不久,那么你會偏向于使用你已經(jīng)掌握的語言來解決問題,這樣會導(dǎo)致寫出一些冗余、低效率的代碼。比如,你不會使用MySQL自帶的AVG()函數(shù),卻會先對記錄集中的值求和然后用PHP循環(huán)來計算平均值。

此外,請注意PHP循環(huán)中的SQL查詢。通常來說,執(zhí)行一個查詢比在結(jié)果中迭代更有效率。

所以,在分析數(shù)據(jù)的時候請利用數(shù)據(jù)庫系統(tǒng)的優(yōu)勢,懂一些SQL的知識將大有裨益。

6、沒有優(yōu)化數(shù)據(jù)庫查詢

99%的PHP性能問題都是由數(shù)據(jù)庫引起的,僅僅一個糟糕的SQL查詢就能讓你的web應(yīng)用徹底癱瘓。MySQL的EXPLAIN statement、Query Profiler,還有很多其他的工具將會幫助你找出這些萬惡的SELECT。

7、不能正確使用數(shù)據(jù)類型

MySQL提供了諸如numeric、string和date等的數(shù)據(jù)類型。如果你想存儲一個時間,那么使用DATE或者DATETIME類型。如果這個時候用INTEGER或者STRING類型的話,那么將會使得SQL查詢非常復(fù)雜,前提是你能使用INTEGER或者STRING來定義那個類型。

很多人傾向于擅自自定義一些數(shù)據(jù)的格式,比如,使用string來存儲序列化的PHP對象。這樣的話數(shù)據(jù)庫管理起來可能會變得簡單些,但會使得MySQL成為一個糟糕的數(shù)據(jù)存儲而且之后很可能會引起故障。

8、在查詢中使用*

永遠(yuǎn)不要使用*來返回一個數(shù)據(jù)表所有列的數(shù)據(jù)。這是懶惰:你應(yīng)該提取你需要的數(shù)據(jù)。就算你需要所有字段,你的數(shù)據(jù)表也不可避免的會產(chǎn)生變化。

9、不使用索引或者過度使用索引

一般性原則是這樣的:select語句中的任何一個where子句表示的字段都應(yīng)該使用索引。

舉 個例子,假設(shè)我們有一個user表,包括numeric ID(主鍵)和email address。登錄的時候,MySQL必須以一個email為依據(jù)查找正確的ID。如果使用了索引的話(這里指email),那么MySQL就能夠使用 更快的搜索算法來定位email,甚至可以說是即時實現(xiàn)。否則,MySQL就只能順序地檢查每一條記錄直到找到正確的email address。

有的人會在每個字段上都添加索引,遺憾的是,執(zhí)行了INSERT或者UPDATE之后這些索引都需要重新生成,這樣就會影響性能。所以,只在需要的時候添加索引。

10、忘記備份!

雖然比較罕見,但是數(shù)據(jù)庫還是有崩潰的危險。硬盤有可能損壞,服務(wù)器有可能崩潰,web主機(jī)提供商有可能會破產(chǎn)!丟失MySQL數(shù)據(jù)將會是災(zāi)難性的,所以請確保你已經(jīng)使用了自動備份或者已經(jīng)復(fù)制到位。

11、Bonus mistake-不考慮使用其他數(shù)據(jù)庫

對于PHP開發(fā)人員來說,MySQL可能是使用最廣泛的數(shù)據(jù)庫系統(tǒng),但并不是唯一的選擇。PostgreSQL和Firebird是最強(qiáng)有力的競爭者:這個兩者都是開源的,而且都沒有被公司收購。微軟提供了sql server Express,甲骨文提供了10g Express,這兩者都是企業(yè)級數(shù)據(jù)庫的免費(fèi)版本。有時候,對于一個較小的web應(yīng)用或者嵌入式應(yīng)用,SQLite也不失為一個可行的替代方案。

下載Java程序員常犯的錯誤word格式文檔
下載Java程序員常犯的錯誤.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報,并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

相關(guān)范文推薦

    JAVA程序員面試題

    JAVA程序員面試題 第一,談?wù)刦inal, finally, finalize的區(qū)別。 final?修飾符(關(guān)鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不......

    java程序員(筆試)

    筆試 一. 選擇題 1. 從“員工”表的“姓名”字段中找出名字包含“瑪麗”的人,下面的哪條select語句正確 A. Select*from 員工 where姓名 =“__瑪麗__” B. Select*from 員工 w......

    java程序員面試題

    1、 你怎樣理解Struts,又那些配置文件,以及作用? 理解:http://ruixin.iteye.com/blog/899289 配置文件:struts.xml 作用:struts 框架mvc 實現(xiàn)低耦合,便于程序的維護(hù)~ 配置文件控制......

    java程序員招聘

    職位描述:1、參加基于 JAVA 技術(shù)的門戶網(wǎng)站的開發(fā); 2、負(fù)責(zé)公司的網(wǎng)站開發(fā)維護(hù)及新產(chǎn)品的研發(fā); 3、書寫技術(shù)文檔和制定開發(fā)規(guī)范; 4、從系統(tǒng)層面去合理析網(wǎng)站產(chǎn)品,并提供開發(fā)工程......

    java程序員之路

    JAVA程序員之路- - 每個人的學(xué)習(xí)方法是不同的,一個人的方法不見得適合另一個人,我只能是談自己的學(xué)習(xí)方法。因為我學(xué)習(xí)Java是完全自學(xué)的,從來沒有問過別人,所以學(xué)習(xí)的過程基本......

    JAVA程序員求職信

    JAVA程序員求職信范文 尊敬的領(lǐng)導(dǎo): 您好!十分感謝您在百忙之中能翻閱我的自薦信。與公司是一種選擇,與我則是一種機(jī)會。在上千份大同小異的求職信中,我期望你手中的這份能給您......

    Java程序員簡歷

    個人簡歷 ********************************************************************* 基本信息 ********************************************************************* 姓......

    java程序員面試題

    姓名: 年齡: 工作年限: 1.int和Integer有什么區(qū)別?2.抽象類(abstract class)和接口(interface)有什么異同?3.List、Set、Map的區(qū)別?4.Spring支持的ORM有哪些,哪些是你用過的?5.使用Spri......

主站蜘蛛池模板: 国产又黄又爽胸又大免费视频| 熟女人妻少妇精品视频| 国产亚洲精aa在线观看see| 中文无码伦av中文字幕| 无码人妻丰满熟妇区五十路在线| 精品无码日韩一区二区三区不卡| 亚洲精品久久区二区三区蜜桃臀| 久久www免费人成人片| 亚洲国产精品线久久| 欧美成aⅴ人高清免费观看| 日韩人妻一区二区三区蜜桃视频| 97超碰人人爱香蕉精品| 日韩精品一区二区三区在线观看| 欧美日韩国产一区二区三区不卡| 国产在线无码不卡影视影院| 97人人模人人爽人人少妇| 尤物色综合欧美五月俺也去| 蜜桃臀无码内射一区二区三区| 日本少妇浓毛bbwbbwbbw| 亚洲中文字幕无码爆乳app| 男女性高爱潮是免费国产| 亚洲欧美综合精品成人网站| 成人免费无码大片a毛片抽搐| 婷婷婷国产在线视频| 久久这里只精品国产免费10| 麻豆精品国产精华精华液好用吗| 全部免费毛片在线播放| 国产97成人亚洲综合在线观看| 成人午夜亚洲精品无码区| 免费无码黄网站在线看| 亚洲综合在线另类色区奇米| 无码专区视频精品老司机| 久久亚洲粉嫩高潮的18p| 精品无码久久久久久国产| 亚洲精品成人av在线| 亚洲中文字幕无码一区在线| 国产自偷在线拍精品热| 成人国产精品一区二区网站公司| 日本边添边摸边做边爱| 精品无码人妻一区二区三区品| 青青草原综合久久大伊人|