Java程序員面試寶典-Java代碼查錯(cuò)_第1頁(yè)
Java程序員面試寶典-Java代碼查錯(cuò)_第2頁(yè)
Java程序員面試寶典-Java代碼查錯(cuò)_第3頁(yè)
Java程序員面試寶典-Java代碼查錯(cuò)_第4頁(yè)
Java程序員面試寶典-Java代碼查錯(cuò)_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、JAVA代碼查錯(cuò)1.abstract class Name private String name;public abstract boolean isStupidName(String name) 大俠們,這有何錯(cuò)誤?答案: 錯(cuò)。abstract method必須以分號(hào)結(jié)尾,且不帶花括號(hào)。2.public class Something void doSomething () private String s = ; int l = s.length(); 有錯(cuò)嗎?答案: 錯(cuò)。局部變量前不能放置任何訪(fǎng)問(wèn)修飾符 (private,public,和protected)。final可以用來(lái)修飾局部

2、變量(final如同abstract和strictfp,都是非訪(fǎng)問(wèn)修飾符,strictfp只能修飾class和method而非variable)。3.abstract class Something private abstract String doSomething ();這好像沒(méi)什么錯(cuò)吧?答案: 錯(cuò)。abstract的methods不能以private修飾。abstract的methods就是讓子類(lèi)implement(實(shí)現(xiàn))具體細(xì)節(jié)的,怎么可以用private把a(bǔ)bstract method封鎖起來(lái)呢? (同理,abstract method前不能加final)。4.public cla

3、ss Something public int addOne(final int x) return +x; 這個(gè)比較明顯。答案: 錯(cuò)。int x被修飾成final,意味著x不能在addOne method中被修改。5.public class Something public static void main(String args) Other o = new Other(); new Something().addOne(o); public void addOne(final Other o) o.i+; class Other public int i;和上面的很相似,都是關(guān)于fin

4、al的問(wèn)題,這有錯(cuò)嗎?答案: 正確。在addOne method中,參數(shù)o被修飾成final。如果在addOne method里我們修改了o的reference,(比如: o = new Other();),那么如同上例這題也是錯(cuò)的。但這里修改的是o的member vairable(成員變量),而o的reference并沒(méi)有改變。6.class Something int i; public void doSomething() System.out.println(i = + i); 有什么錯(cuò)呢? 看不出來(lái)啊。答案: 正確。輸出的是i = 0。int i屬於instant variable

5、(實(shí)例變量,或叫成員變量)。instant variable有default 的default value是0。7.class Something final int i; public void doSomething() System.out.println(i = + i); 和上面一題只有一個(gè)地方不同,就是多了一個(gè)final。這難道就錯(cuò)了嗎?答案: 錯(cuò)。final int i是個(gè)final的instant variable (實(shí)例變量,或叫成員變量)。final的instant variable沒(méi)有default value,必須在constructor (構(gòu)造器)結(jié)束之前被賦予一個(gè)明

6、確的值??梢孕薷臑閒inal int i = 0;。8.public class Something public static void main(String args) Something s = new Something(); System.out.println(s.doSomething() returns + doSomething(); public String doSomething() return Do something .; 看上去很完美。答案: 錯(cuò)??瓷先ピ趍ain里call doSomething沒(méi)有什么問(wèn)題,畢竟兩個(gè)methods都在同一個(gè)class里。但仔

7、細(xì)看,main是static的。static method不能直接call non-static methods??筛某蒘ystem.out.println(s.doSomething() returns + s.doSomething();。同理,static method不能訪(fǎng)問(wèn)non-static instant variable。9.此處,Something類(lèi)的文件名叫OtherThing.javaclass Something private static void main(String something_to_do) System.out.println(Do somethin

8、g .); 這個(gè)好像很明顯。答案: 正確。從來(lái)沒(méi)有人說(shuō)過(guò)Java的Class名字必須和其文件名相同。但public class的名字必須和文件名相同。10.interface A int x = 0; class B int x =1; class C extends B implements A public void pX() System.out.println(x); public static void main(String args) new C().pX(); 答案:錯(cuò)誤。在編譯時(shí)會(huì)發(fā)生錯(cuò)誤(錯(cuò)誤描述不同的JVM有不同的信息,意思就是未明確的x調(diào)用,兩個(gè)x都匹配(就象在同時(shí)im

9、port java.util和java.sql兩個(gè)包時(shí)直接聲明Date一樣)。對(duì)于父類(lèi)的變量,可以用super.x來(lái)明確,而接口的屬性默認(rèn)隱含為 public static final.所以可以通過(guò)A.x來(lái)明確。11.interface Playable void play();interface Bounceable void play(); interface Rollable extends Playable, Bounceable Ball ball = new Ball(PingPang); class Ball implements Rollable private String

10、name; public String getName() return name; public Ball(String name) = name; public void play() ball = new Ball(Football);System.out.println(ball.getName(); 這個(gè)錯(cuò)誤不容易發(fā)現(xiàn)。答案: 錯(cuò)。interface Rollable extends Playable, Bounceable沒(méi)有問(wèn)題。interface可繼承多個(gè)interfaces,所以這里沒(méi)錯(cuò)。問(wèn)題出在interface Rollable里的Ball ball = new Ball

11、(PingPang);。任何在interface里聲明的interface variable (接口變量,也可稱(chēng)成員變量),默認(rèn)為public static final。也就是說(shuō)Ball ball = new Ball(PingPang);實(shí)際上是public static final Ball ball = new Ball(PingPang);。在Ball類(lèi)的Play()方法中,ball = new Ball(Football);改變了ball的reference,而這里的ball來(lái)自Rollable interface,Rollable interface里的ball是public st

12、atic final的,final的object是不能被改變r(jià)eference的。因此編譯器將在ball = new Ball(Football);這里顯示有錯(cuò)。JAVA編程題1現(xiàn)在輸入n個(gè)數(shù)字,以逗號(hào),分開(kāi);然后可選擇升或者降序排序;按提交鍵就在另一頁(yè)面顯示按什么排序,結(jié)果為,提供resetimport java.util.*;public class bycomma public static String splitStringByComma(String source) if(source=null|source.trim().equals() return null; StringT

13、okenizer commaToker=new tringTokenizer(source,); String result = new StringcommaToker.countTokens(); int i=0; while(commaToker.hasMoreTokens() resulti = commaToker.nextToken();i+;return result;public static void main(String args) String s = splitStringByComma(5,8,7,4,3,9,1); int ii = new ints.length

14、; for(int i = 0;is.length;i+) iii =Integer.parseInt(si); Arrays.sort(ii); /asc for(int i=0;i=0;i-) System.out.println(iii); 2金額轉(zhuǎn)換,阿拉伯?dāng)?shù)字的金額轉(zhuǎn)換成中國(guó)傳統(tǒng)的形式如:(¥1011)(一千零一拾一元整)輸出。package test.format;import java.text.NumberFormat;import java.util.HashMap;public class SimpleMoneyFormat public static final Stri

15、ng EMPTY = ;public static final String ZERO = 零;public static final String ONE = 壹;public static final String TWO = 貳;public static final String THREE = 叁;public static final String FOUR = 肆; public static final String FIVE = 伍;public static final String SIX = 陸;public static final String SEVEN = 柒;

16、 public static final String EIGHT = 捌; public static final String NINE = 玖; public static final String TEN = 拾; public static final String HUNDRED = 佰; public static final String THOUSAND = 仟; public static final String TEN_THOUSAND = 萬(wàn); public static final String HUNDRED_MILLION = 億; public static

17、final String YUAN = 元; public static final String JIAO = 角; public static final String FEN = 分; public static final String DOT = .; private static SimpleMoneyFormat formatter = null;private HashMap chineseNumberMap = new HashMap();private HashMap chineseMoneyPattern = new HashMap();private NumberFor

18、mat numberFormat = NumberFormat.getInstance(); private SimpleMoneyFormat() numberFormat.setMaximumFractionDigits(4); numberFormat.setMinimumFractionDigits(2); numberFormat.setGroupingUsed(false); chineseNumberMap.put(0, ZERO); chineseNumberMap.put(1,ONE); chineseNumberMap.put(2, TWO);chineseNumberMa

19、p.put(3, THREE); chineseNumberMap.put(4, FOUR); chineseNumberMap.put(5, FIVE); chineseNumberMap.put(6, SIX); chineseNumberMap.put(7, SEVEN); chineseNumberMap.put(8, EIGHT);chineseNumberMap.put(9, NINE);chineseNumberMap.put(DOT, DOT); chineseMoneyPattern.put(1, TEN);chineseMoneyPattern.put(2, HUNDRED

20、);chineseMoneyPattern.put(3, THOUSAND); chineseMoneyPattern.put(4, TEN_THOUSAND); chineseMoneyPattern.put(5, TEN);chineseMoneyPattern.put(6, HUNDRED); chineseMoneyPattern.put(7, THOUSAND); chineseMoneyPattern.put(8, HUNDRED_MILLION); public static SimpleMoneyFormat getInstance() if (formatter = null

21、) formatter = new SimpleMoneyFormat(); return formatter;public String format(String moneyStr) checkPrecision(moneyStr); String result; result = convertToChineseNumber(moneyStr); result = addUnitsToChineseMoneyString(result); return result; public String format(double moneyDouble) return format(numbe

22、rFormat.format(moneyDouble); public String format(int moneyInt) return format(numberFormat.format(moneyInt); public String format(long moneyLong) return format(numberFormat.format(moneyLong); public String format(Number moneyNum) return format(numberFormat.format(moneyNum); private String convertToC

23、hineseNumber(String moneyStr) String result; StringBuffer cMoneyStringBuffer = new StringBuffer();for (int i = 0; i 0; i-) cMoneyStringBuffer.insert(i, chineseMoneyPattern.get(EMPTY + moneyPatternCursor); moneyPatternCursor = moneyPatternCursor = 8 ? 1 : moneyPatternCursor + 1; String fractionPart =

24、 cMoneyStringBuffer.substring(cMoneyStringBuffer.indexOf(.); cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf(.), cMoneyStringBuffer.length(); while (cMoneyStringBuffer.indexOf(零拾) != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf(零拾), cMoneyStringBuffer.indexOf(零拾) + 2, ZERO); while

25、(cMoneyStringBuffer.indexOf(零佰) != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf(零佰), cMoneyStringBuffer.indexOf(零佰) + 2, ZERO);while (cMoneyStringBuffer.indexOf(零仟) != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf(零仟), cMoneyStringBuffer.indexOf(零仟) + 2, ZERO);while (cMoneyS

26、tringBuffer.indexOf(零萬(wàn)) != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf(零萬(wàn)), cMoneyStringBuffer.indexOf(零萬(wàn)) + 2, TEN_THOUSAND); while (cMoneyStringBuffer.indexOf(零億) != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf(零億), cMoneyStringBuffer.indexOf(零億) + 2, HUNDRED_MILLION); w

27、hile (cMoneyStringBuffer.indexOf(零零) != -1) cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf(零零), cMoneyStringBuffer.indexOf(零零) + 2, ZERO); if (cMoneyStringBuffer.lastIndexOf(ZERO) = cMoneyStringBuffer.length() - 1) cMoneyStringBuffer.delete(cMoneyStringBuffer.length() - 1, cMoneyStringBuffer.

28、length(); cMoneyStringBuffer.append(fractionPart);result = cMoneyStringBuffer.toString(); return result; private String addUnitsToChineseMoneyString(String moneyStr) String result; StringBuffer cMoneyStringBuffer = new StringBuffer(moneyStr); int indexOfDot = cMoneyStringBuffer.indexOf(DOT); cMoneyS

29、tringBuffer.replace(indexOfDot, indexOfDot + 1, YUAN); cMoneyStringBuffer.insert(cMoneyStringBuffer.length() - 1, JIAO); cMoneyStringBuffer.insert(cMoneyStringBuffer.length(), FEN); if (cMoneyStringBuffer.indexOf(零角零分) != -1)/沒(méi)有零頭,加整cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf(零角零分), cMoney

30、StringBuffer.length(), 整); else if (cMoneyStringBuffer.indexOf(零分) != -1)/沒(méi)有零分,加整 cMoneyStringBuffer.replace(cMoneyStringBuffer.indexOf(零分), cMoneyStringBuffer.length(), 整);else if(cMoneyStringBuffer.indexOf(零角)!=-1) cMoneyStringBuffer.delete(cMoneyStringBuffer.indexOf(零角),cMoneyStringBuffer.indexOf

31、(零角)+2); tmpBuffer.append(整); result = cMoneyStringBuffer.toString(); return result; private void checkPrecision(String moneyStr) int fractionDigits = moneyStr.length() - moneyStr.indexOf(DOT) - 1; if (fractionDigits 2) throw new RuntimeException(金額 + moneyStr + 的小數(shù)位多于兩位。); /精度不能比分低 public static vo

32、id main(String args) System.out.println(getInstance().format(new Double(10010001.01); 3、繼承時(shí)候類(lèi)的執(zhí)行順序問(wèn)題,一般都是選擇題,問(wèn)你將會(huì)打印出什么? 答:父類(lèi): package test; public class FatherClass public FatherClass() System.out.println(FatherClass Create); 子類(lèi): package test; import test.FatherClass; public class ChildClass extends

33、 FatherClass public ChildClass() System.out.println(ChildClass Create); public static void main(String args) FatherClass fc = new FatherClass(); ChildClass cc = new ChildClass(); 輸出結(jié)果: C:java test.ChildClass FatherClass Create FatherClass Create ChildClass Create4、內(nèi)部類(lèi)的實(shí)現(xiàn)方式? 答:示例代碼如下: package test; p

34、ublic class OuterClass private class InterClass public InterClass() System.out.println(InterClass Create); public OuterClass() InterClass ic = new InterClass(); System.out.println(OuterClass Create); public static void main(String args) OuterClass oc = new OuterClass(); 輸出結(jié)果: C:java test/OuterClass

35、InterClass Create OuterClass Create 再一個(gè)例題: public class OuterClass private double d1 = 1.0; /insert code here You need to insert an inner class declaration at line 3. Which two inner class declarations are valid?(Choose two.) A. class InnerOne public static double methoda() return d1; B. public clas

36、s InnerOne static double methoda() return d1; C. private class InnerOne double methoda() return d1; D. static class InnerOne protected double methoda() return d1; E. abstract class InnerOne public abstract double methoda(); 說(shuō)明如下: 一.靜態(tài)內(nèi)部類(lèi)可以有靜態(tài)成員,而非靜態(tài)內(nèi)部類(lèi)則不能有靜態(tài)成員。 故 A、B 錯(cuò) 二.靜態(tài)內(nèi)部類(lèi)的非靜態(tài)成員可以訪(fǎng)問(wèn)外部類(lèi)的靜態(tài)變量,而不可訪(fǎng)

37、問(wèn)外部類(lèi)的非靜態(tài)變量;return d1 出錯(cuò)。故 D 錯(cuò) 三.非靜態(tài)內(nèi)部類(lèi)的非靜態(tài)成員可以訪(fǎng)問(wèn)外部類(lèi)的非靜態(tài)變量。 故 C 正確 四.答案為C、E5、Java 的通信編程,編程題(或問(wèn)答),用JAVA SOCKET編程,讀服務(wù)器幾個(gè)字符,再寫(xiě)入本地顯示? 答:Server端程序: package test; import .*;import java.io.*; public class Server private ServerSocket ss; private Socket socket; private BufferedReader in; private PrintWriter o

38、ut; public Server() try ss=new ServerSocket(10000); while(true) socket = ss.accept(); String RemoteIP = socket.getInetAddress().getHostAddress(); String RemotePort = :+socket.getLocalPort();System.out.println(A client come in!IP:+RemoteIP+RemotePort); in = new BufferedReader(new InputStreamReader(so

39、cket.getInputStream(); String line = in.readLine(); System.out.println(Cleint send is : + line); out = new PrintWriter(socket.getOutputStream(),true); out.println(Your Message Received!); out.close(); in.close(); socket.close(); catch (IOException e) out.println(wrong); public static void main(Strin

40、g args) new Server(); Client端程序: package test; import java.io.*; import .*; public class Client Socket socket; BufferedReader in; PrintWriter out; public Client() try System.out.println(Try to Connect to :10000);socket = new Socket(,10000); System.out.println(The Server Connected!); System.out.print

41、ln(Please enter some Character:); BufferedReader line = new BufferedReader(new InputStreamReader(System.in); out = new PrintWriter(socket.getOutputStream(),true); Out3、 接口和內(nèi)部類(lèi)、抽象類(lèi)的特征答:接口:在一個(gè)類(lèi)里,只有申明沒(méi)有實(shí)現(xiàn)。內(nèi)部類(lèi):是在一個(gè)類(lèi)的內(nèi)部定義的一個(gè)類(lèi);抽象類(lèi):是以abstract 定義的,里面至少有一個(gè)抽象方法。4、 文件讀寫(xiě)的基本類(lèi)答:File Reader 類(lèi)和FileWriter類(lèi)分別繼承自Reade

42、r類(lèi)和Writer類(lèi)。FileReader類(lèi)用于讀取文件,F(xiàn)ile Writer類(lèi)用于將數(shù)據(jù)寫(xiě)入文件,這兩各類(lèi)在使用前,都必須要調(diào)用其構(gòu)造方法創(chuàng)建相應(yīng)的對(duì)象,然后調(diào)用相應(yīng)的read()或 write()方法。6、 線(xiàn)程的基本概念、線(xiàn)程的本狀態(tài)以及狀態(tài)之間的關(guān)系?新建 (Born) : 新建的線(xiàn)程處于新建狀態(tài)?就緒 (Ready) : 在創(chuàng)建線(xiàn)程后,它將處于就緒狀態(tài),等待 start() 方法被調(diào)用?運(yùn)行 (Running) : 線(xiàn)程在開(kāi)始執(zhí)行時(shí)進(jìn)入運(yùn)行狀態(tài)?睡眠 (Sleeping) : 線(xiàn)程的執(zhí)行可通過(guò)使用 sleep() 方法來(lái)暫時(shí)中止。在睡眠后,線(xiàn)程將進(jìn)入就緒狀態(tài)?等待 (Waiting

43、) : 如果調(diào)用了 wait() 方法,線(xiàn)程將處于等待狀態(tài)。用于在兩個(gè)或多個(gè)線(xiàn)程并發(fā)運(yùn)行時(shí)。?掛起 (Suspended) : 在臨時(shí)停止或中斷線(xiàn)程的執(zhí)行時(shí),線(xiàn)程就處于掛起狀態(tài)。?恢復(fù) (Resume) : 在掛起的線(xiàn)程被恢復(fù)執(zhí)行時(shí),可以說(shuō)它已被恢復(fù)。?阻塞 (Blocked) 在線(xiàn)程等待一個(gè)事件時(shí)(例如輸入/輸出操作),就稱(chēng)其處于阻塞狀態(tài)。?死亡 (Dead) 在 run() 方法已完成執(zhí)行或其 stop() 方法被調(diào)用之后,線(xiàn)程就處于死亡狀態(tài)。 5、 串行化的注意事項(xiàng)以及如何實(shí)現(xiàn)串行化答:如果有循環(huán)引用是不可以串行化的。對(duì)象輸出流的WriteObject方法和 對(duì)象輸入流的ReadObec

44、t 方法 7、 線(xiàn)程的同步、如何實(shí)現(xiàn)線(xiàn)程的同步答:當(dāng)兩個(gè)或多個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)同一個(gè)變量,并且以個(gè)線(xiàn)程需要修改這個(gè)變量。就要用到線(xiàn)程同步。在Java 中,同步是通過(guò) synchronized 關(guān)鍵字來(lái)定義的。 諾是想同步化某程序段,可以使用 synchronized(object)方法,其中內(nèi)的程序語(yǔ)句被同步化。9、 socket通信(tcp/udp區(qū)別及JAVA的實(shí)現(xiàn)方式)TCP傳輸控制協(xié)議,具有極高的可靠性,保證數(shù)據(jù)包按照順序準(zhǔn)確到達(dá),但其也有著很高的額外負(fù)擔(dān)。UDP使用者數(shù)據(jù)元協(xié)議,并不能保證數(shù)據(jù)包會(huì)被成功的送達(dá),也不保證數(shù)據(jù)包到達(dá)的順序,但其傳輸速度很快。大多數(shù)我們會(huì)使用TCP,偶爾才會(huì)動(dòng)

45、用UDP,如聲音訊號(hào),即使少量遺失,也無(wú) 關(guān)緊要。10、 JAVA的事件委托機(jī)制和垃圾回收機(jī)制java 事件委托機(jī)制的概念,一個(gè)源產(chǎn)生一個(gè)事件并將它送到一個(gè)或多個(gè)監(jiān)聽(tīng)器那里。在這種方案中,監(jiān)聽(tīng)器簡(jiǎn)單的等待,直到它收到一個(gè)事件。一旦事件被接受,監(jiān)聽(tīng)器將處理這個(gè)事件,然后返回。垃圾回收機(jī)制 垃圾收集是將分配給對(duì)象但不在使用的內(nèi)存回收或釋放的過(guò)程。如果一個(gè)對(duì)象沒(méi)有指向它的引用或者其賦值為null,則次對(duì)象適合進(jìn)行垃圾回收11、 JDBC調(diào)用數(shù)據(jù)庫(kù)的基本步驟導(dǎo)入必要的類(lèi),裝入JDBC驅(qū)動(dòng)程序,識(shí)別數(shù)據(jù)源,分配一個(gè)Connection對(duì)象,分配一個(gè)Statement對(duì)象,使用Statement執(zhí)行一個(gè)查

46、詢(xún),從返回的ResultSet對(duì)象中檢索數(shù)據(jù),關(guān)閉ResultSet,關(guān)閉Statement對(duì)象,關(guān)閉Connection對(duì)象12、 解析XML文件的幾種方式和區(qū)別答:Dom解析 在內(nèi)存中創(chuàng)建一個(gè)DOM樹(shù),能隨機(jī)訪(fǎng)問(wèn)文件內(nèi)容,也可以修改原文件內(nèi)容SAX解析 線(xiàn)性解析,不能隨機(jī)訪(fǎng)問(wèn),也無(wú)法修改原文件Dom解析要先用SAX解析創(chuàng)建DOM樹(shù)13、 JAVA的四種基本權(quán)限的定義public private protected 默認(rèn)14、 JAVA的國(guó)際化 答:Java 中提供了諾干國(guó)際化明感類(lèi),來(lái)實(shí)現(xiàn)國(guó)際化的。例如:dateformat timezone 等等。附錄資料:java處理高并發(fā)高負(fù)載類(lèi)網(wǎng)站

47、的優(yōu)化方法java處理高并發(fā)高負(fù)載類(lèi)網(wǎng)站中數(shù)據(jù)庫(kù)的設(shè)計(jì)方法(java教程,java處理大量數(shù)據(jù),java高負(fù)載數(shù)據(jù))一:高并發(fā)高負(fù)載類(lèi)網(wǎng)站關(guān)注點(diǎn)之?dāng)?shù)據(jù)庫(kù)沒(méi)錯(cuò),首先是數(shù)據(jù)庫(kù),這是大多數(shù)應(yīng)用所面臨的首個(gè)SPOF。尤其是Web2.0的應(yīng)用,數(shù)據(jù)庫(kù)的響應(yīng)是首先要解決的。一般來(lái)說(shuō)MySQL是最常用的,可能最初是一個(gè)mysql主機(jī),當(dāng)數(shù)據(jù)增加到100萬(wàn)以上,那么,MySQL的效能急劇下降。常用的優(yōu)化措施是M-S(主-從)方式進(jìn)行同步復(fù)制,將查詢(xún)和操作和分別在不同的服務(wù)器上進(jìn)行操作。我推薦的是M-M-Slaves方式,2個(gè)主Mysql,多個(gè)Slaves,需要注意的是,雖然有2個(gè)Master,但是同時(shí)只有1個(gè)

48、是Active,我們可以在一定時(shí)候切換。之所以用2個(gè)M,是保證M不會(huì)又成為系統(tǒng)的SPOF。Slaves可以進(jìn)一步負(fù)載均衡,可以結(jié)合LVS,從而將select操作適當(dāng)?shù)钠胶獾讲煌膕laves上。以上架構(gòu)可以抗衡到一定量的負(fù)載,但是隨著用戶(hù)進(jìn)一步增加,你的用戶(hù)表數(shù)據(jù)超過(guò)1千萬(wàn),這時(shí)那個(gè)M變成了SPOF。你不能任意擴(kuò)充Slaves,否則復(fù)制同步的開(kāi)銷(xiāo)將直線(xiàn)上升,怎么辦?我的方法是表分區(qū),從業(yè)務(wù)層面上進(jìn)行分區(qū)。最簡(jiǎn)單的,以用戶(hù)數(shù)據(jù)為例。根據(jù)一定的切分方式,比如id,切分到不同的數(shù)據(jù)庫(kù)集群去。全局?jǐn)?shù)據(jù)庫(kù)用于meta數(shù)據(jù)的查詢(xún)。缺點(diǎn)是每次查詢(xún),會(huì)增加一次,比如你要查一個(gè)用戶(hù)nightsailer,你首先

49、要到全局?jǐn)?shù)據(jù)庫(kù)群找到nightsailer對(duì)應(yīng)的cluster id,然后再到指定的cluster找到nightsailer的實(shí)際數(shù)據(jù)。每個(gè)cluster可以用m-m方式,或者m-m-slaves方式。這是一個(gè)可以擴(kuò)展的結(jié)構(gòu),隨著負(fù)載的增加,你可以簡(jiǎn)單的增加新的mysql cluster進(jìn)去。需要注意的是:1、禁用全部auto_increment的字段2、id需要采用通用的算法集中分配3、要具有比較好的方法來(lái)監(jiān)控mysql主機(jī)的負(fù)載和服務(wù)的運(yùn)行狀態(tài)。如果你有30臺(tái)以上的mysql數(shù)據(jù)庫(kù)在跑就明白我的意思了。4、不要使用持久性鏈接(不要用pconnect),相反,使用sqlrelay這種第三方的

50、數(shù)據(jù)庫(kù)鏈接池,或者干脆自己做,因?yàn)閜hp4中mysql的鏈接池經(jīng)常出問(wèn)題。二:高并發(fā)高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)之HTML靜態(tài)化其實(shí)大家都知道,效率最高、消耗最小的就是純靜態(tài)化,所以我們盡可能使我們的網(wǎng)站上的頁(yè)面采用靜態(tài)頁(yè)面來(lái)實(shí)現(xiàn),這個(gè)最簡(jiǎn)單的方法其實(shí)也是 最有效的方法。但是對(duì)于大量?jī)?nèi)容并且頻繁更新的網(wǎng)站,我們無(wú)法全部手動(dòng)去挨個(gè)實(shí)現(xiàn),于是出現(xiàn)了我們常見(jiàn)的信息發(fā)布系統(tǒng)CMS,像我們常訪(fǎng)問(wèn)的各個(gè)門(mén)戶(hù)站點(diǎn) 的新聞?lì)l道,甚至他們的其他頻道,都是通過(guò)信息發(fā)布系統(tǒng)來(lái)管理和實(shí)現(xiàn)的,信息發(fā)布系統(tǒng)可以實(shí)現(xiàn)最簡(jiǎn)單的信息錄入自動(dòng)生成靜態(tài)頁(yè)面,還能具備頻道管理、權(quán)限 管理、自動(dòng)抓取等功能,對(duì)于一個(gè)大型網(wǎng)站來(lái)說(shuō),擁有一套高效、

51、可管理的CMS是必不可少的。除了門(mén)戶(hù)和信息發(fā)布類(lèi)型的網(wǎng)站,對(duì)于交互性要求很高的社區(qū)類(lèi)型網(wǎng)站來(lái)說(shuō),盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內(nèi)的帖子、文章進(jìn)行實(shí)時(shí)的靜態(tài)化,有更新的時(shí)候再重新靜態(tài)化也是大量使用的策略,像Mop的大雜燴就是使用了這樣的策略,網(wǎng)易社區(qū)等也是如此。 同時(shí),html靜態(tài)化也是某些緩存策略使用的手段,對(duì)于系統(tǒng)中頻繁使用數(shù)據(jù)庫(kù)查詢(xún)但是內(nèi)容更新很小的應(yīng)用,可以考慮使用html靜態(tài)化來(lái)實(shí)現(xiàn),比如論壇 中論壇的公用設(shè)置信息,這些信息目前的主流論壇都可以進(jìn)行后臺(tái)管理并且存儲(chǔ)再數(shù)據(jù)庫(kù)中,這些信息其實(shí)大量被前臺(tái)程序調(diào)用,但是更新頻率很小,可以考慮將這 部分內(nèi)容進(jìn)行后臺(tái)更新的時(shí)候進(jìn)行靜態(tài)

52、化,這樣避免了大量的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)請(qǐng)求高并發(fā)。網(wǎng)站HTML靜態(tài)化解決方案當(dāng)一個(gè)Servlet資源請(qǐng)求到達(dá)WEB服務(wù)器之后我們會(huì)填充指定的JSP頁(yè)面來(lái)響應(yīng)請(qǐng)求:HTTP請(qǐng)求Web服務(wù)器Servlet-業(yè)務(wù)邏輯處理-訪(fǎng)問(wèn)數(shù)據(jù)-填充JSP-響應(yīng)請(qǐng)求HTML靜態(tài)化之后:HTTP請(qǐng)求Web服務(wù)器Servlet-HTML-響應(yīng)請(qǐng)求靜態(tài)訪(fǎng)求如下Servlet:public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException if(request.getP

53、arameter(chapterId) != null) String chapterFileName = bookChapterRead_+request.getParameter(chapterId)+.html; String chapterFilePath = getServletContext().getRealPath(/) + chapterFileName; File chapterFile = new File(chapterFilePath); if(chapterFile.exists()response.sendRedirect(chapterFileName);ret

54、urn;/如果有這個(gè)文件就告訴瀏覽器轉(zhuǎn)向 INovelChapterBiz novelChapterBiz = new NovelChapterBizImpl(); NovelChapter novelChapter = novelChapterBiz.searchNovelChapterById(Integer.parseInt(request.getParameter(chapterId);/章節(jié)信息 int lastPageId = novelChapterBiz.searchLastCHapterId(novelChapter.getNovelId().getId(), novelCh

55、apter.getId(); int nextPageId = novelChapterBiz.searchNextChapterId(novelChapter.getNovelId().getId(), novelChapter.getId(); request.setAttribute(novelChapter, novelChapter); request.setAttribute(lastPageId, lastPageId); request.setAttribute(nextPageId, nextPageId); new CreateStaticHTMLPage().create

56、StaticHTMLPage(request, response, getServletContext(), chapterFileName, chapterFilePath, /bookRead.jsp); 生成HTML靜態(tài)頁(yè)面的類(lèi):package com.jb.y2t034.thefifth.web.servlet;import java.io.ByteArrayOutputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import ja

57、va.io.PrintWriter;import javax.servlet.RequestDispatcher;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServlet

58、ResponseWrapper;/* 創(chuàng)建HTML靜態(tài)頁(yè)面* 功能:創(chuàng)建HTML靜態(tài)頁(yè)面* 時(shí)間:2009年1011日* 地點(diǎn):home* author mavk*/public class CreateStaticHTMLPage /* * 生成靜態(tài)HTML頁(yè)面的方法 * param request 請(qǐng)求對(duì)象 * param response 響應(yīng)對(duì)象 * param servletContext Servlet上下文 * param fileName 文件名稱(chēng) * param fileFullPath 文件完整路徑 * param jspPath 需要生成靜態(tài)文件的JSP路徑(相對(duì)即可)

59、* throws IOException * throws ServletException */ public void createStaticHTMLPage(HttpServletRequest request, HttpServletResponse response,ServletContext servletContext,String fileName,String fileFullPath,String jspPath) throws ServletException, IOException response.setContentType(text/html;charset

60、=gb2312);/設(shè)置HTML結(jié)果流編碼(即HTML文件編碼) RequestDispatcher rd = servletContext.getRequestDispatcher(jspPath);/得到JSP資源 final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();/用于從ServletOutputStream中接收資源 final ServletOutputStream servletOuputStream = new ServletOutputStream()/用于從HttpS

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論