【第一篇】
我是如何提高口語水平的?
其次、確定自己的發(fā)音水平。我有個(gè)朋友對我說他的發(fā)音沒問題,可實(shí)際上他說得很多詞我都聽不懂。你學(xué)的是英國音還 是美國音都無所謂,反正最終從你嘴里出來的肯定是中國音。最重要的是發(fā)音要合理。英語每一個(gè)單詞都有自己的念法,你不能憑空想象。比如,有人把 RESUME讀做RE-'SOOM,這樣,別人說RE-SIU-'MAY,你不知道是什么。你念RE-'SOOM,別人也聽不懂。再次、確定自己的英語學(xué) 習(xí)目標(biāo)。我這里僅把口語交流做為目標(biāo)。最后、開始學(xué)習(xí)。
1、口語學(xué)習(xí)的關(guān)鍵是要模仿人家的說話。這包括語音和語調(diào)兩部分。中國英語教學(xué)重視語調(diào)的很少,盡管很多時(shí)候語調(diào)可能比語音更重要。
2、買一臺錄音機(jī),找一合磁帶。根據(jù)你的水平,可以選擇新概念第二或第三冊,也可以到圖書館借一套有書和磁帶的小故事集。注意:一定要有書,故事篇幅不能太長,生詞量要小,過于簡單沒有關(guān)系。我傾向于使用故事,而不是對話或新聞聽力材料。
3、進(jìn)行跟讀訓(xùn)練。放磁帶,看著書,搞明白每一個(gè)單詞的意思,理解整個(gè)故事情節(jié)。然后,放一句,暫停,學(xué)著人家讀一句,然后,放下一句,暫停,再學(xué)一句,繼續(xù)。
4、跟讀過程中要注意的幾點(diǎn):
(1)一定要盡力模仿發(fā)音和語調(diào),越象越好。
(2)開始時(shí)速度可以比較慢,要逐步使自己跟上人家的速度。
(3)中間可以回倒重放,但我傾向于讓大家完成一小段后再回去重來。
5、同步閱讀。當(dāng)你對文章發(fā)音、語調(diào)完全掌握之后,就要在放錄音的同時(shí)同步跟讀。爭取讓自己的聲音與他完全重合。注意語調(diào)和語音。如果中間有結(jié)巴的地方也不要緊,繼續(xù)讀下去,然后再回來重讀。
6、關(guān)掉錄音機(jī),朗誦課文。注意使用學(xué)到的語音語調(diào)。帶滾瓜爛熟之后,可以進(jìn)入下一篇課文。
這樣,一兩個(gè)月之后,當(dāng)你“精讀”過五到十篇約一千字篇幅的文章之后,你會發(fā)現(xiàn)你的英語發(fā)音和聽力有了明顯的進(jìn)步。再配合其他學(xué)習(xí),如與人聊天,看電視,聽廣播,等等,口語水平會得到顯著提高。
【第二篇】
英語作為一種工具,其實(shí)用性愈顯重要。傳統(tǒng)英語教育方法由于過于艱深化,以及盲目的應(yīng)試模式使大部分的英語學(xué)習(xí)者學(xué)了幾年甚至數(shù)十年,卻仍然處于聽不懂開不了口的尷尬境地。那么究竟如何才能在比較短的時(shí)間里快速提高口語水平,讓她真正為你所用呢?
西方最新流行一種外語學(xué)習(xí)理論,即口語提高的最好方式就是采用短期突破法。從下面的公式中,就可以看出,口語短期突破的方法是很有效的。
口語提高速度定律=說英語時(shí)間/說中文時(shí)間Speed of learning English=Speaking English/Speaking Chinese ( in a period of time)
比如,在給定的一天時(shí)間內(nèi)(16小時(shí)),學(xué)生A練習(xí)英語口語的時(shí)間為14小時(shí),說中文的時(shí)間為2小時(shí),兩者的比例為7:1;學(xué)生B練習(xí)口語的時(shí)間為2
小時(shí)英語,說中文的時(shí)間為14小時(shí)。比例為1:7。如此一來,學(xué)生A比學(xué)生B說英語的比例大49倍。
我們認(rèn)為:這一理論其實(shí)就是對語言學(xué)習(xí)規(guī)律一次很好的回歸,語言的核心是使用者能夠隨時(shí)隨地地使用它。你用的時(shí)間越長,你就越熟練,這里我們說的使用
就是“說”,用嘴巴表達(dá)出來,而不是用眼睛和腦子去看和死記。如果你能夠在一段時(shí)間內(nèi)的大部分時(shí)間里堅(jiān)持持續(xù)使用英語而不是中文進(jìn)行表達(dá),把學(xué)習(xí)英語的任
務(wù)轉(zhuǎn)化成母語似的說話習(xí)慣,你就完全可以在很短的時(shí)間內(nèi)有效掌握一口流利的英語口語。
當(dāng)然現(xiàn)實(shí)情況卻是:很多人并沒有這樣的勇氣和能力去堅(jiān)持使用一個(gè)完全不熟悉的語言進(jìn)行日常的交流!所以選用一套優(yōu)秀的教材和相應(yīng)的工具就顯得異常重要了,這種教材應(yīng)該具備以下特點(diǎn)才能幫助你克服困難:
1、能夠隨時(shí)隨地學(xué)習(xí),讓你很容易就接觸到英語;
2、能夠讓你脫離書本,完全浸在英語環(huán)境里;
3、內(nèi)容應(yīng)該精挑細(xì)選,具備典型性和代表性,幫助你在短時(shí)間內(nèi)掌握精華內(nèi)容,從而建立起長期學(xué)習(xí)的信心和基本能力。
同時(shí)你應(yīng)該注意培養(yǎng)自己的自信,學(xué)會勇敢犯錯(cuò)誤,克服恐懼的心理障礙。其實(shí)這種心理障礙是成人自己加給自己的,為什么我們小時(shí)候?qū)W母語這么自然容易,就是因?yàn)槟莻€(gè)時(shí)候不知道什么是丟臉。所以我們應(yīng)該象小時(shí)候那樣暫時(shí)忘卻丟臉,勇敢地去丟臉!
【第三篇】
想提高英語口語水平,首先要在語音上下功夫:)~
下面是些方法,你可以根據(jù)自己的學(xué)習(xí)方式掌握:)~
1.其次,要有大量的閱讀和聽力做基礎(chǔ)。在讀和聽的過程中,積累了詞匯,掌握了句型,熟悉了用英語表達(dá)思想的方式,最重要的是培養(yǎng)了語感。
2.同時(shí),學(xué)英語口語也需要用多種辦法:如大聲朗讀英語對話和文章,朗讀各種句型的例句和口語中最常用的句子,背誦文章及演講,與會英語的人練口語,當(dāng)
然,最好與以英語為母語的人練口語。事實(shí)上,自言自語亦是練習(xí)口語的有效的方法之一。如果你把自己說的英語給錄制下來,聽聽自己的錄音,若有問題,再加以
改正,效果就會更好。
3.說英語還要有膽量。如果你能在說不太出口,或是說不好的情況下,大膽地說。說上一段時(shí)間后,突然有一天你會自如、清楚地表達(dá)自己的思想。有了大膽說的精神,你才能闖過口語的難關(guān)。
4.只會學(xué)英語,而不能盡快地去用,那就永遠(yuǎn)也學(xué)不好英語。在學(xué)英語的過程中,要始終尋找機(jī)會說英語。比如說,你周圍有幾個(gè)喜歡說英語的朋友,大家在一起
就要用英語來交談。這種交談有利于每個(gè)人的英語學(xué)習(xí),因?yàn)榇蠹叶加袡C(jī)會運(yùn)用自己已掌握的英語知識來交流思想,鞏固了已學(xué)的知識,并把知識轉(zhuǎn)化成技能,同
時(shí),還能從別人那兒學(xué)到新的東西。要想學(xué)好英語口語就要多說。
5.能同以英語為母語的人說英語是最佳方法。在國內(nèi)學(xué)英語缺乏環(huán)境,看電影學(xué)英語口語是彌補(bǔ)環(huán)境不足的好方法。英語電影是一部英語國家的生活、文化、風(fēng)俗
等一切的百科全書,是最全的英語口語百科全書。大量地看英文電影就是你徹底攻克英語“聽”和“說”的法寶。英語電影把你帶入了一個(gè)新的世界中去。你在電影
中,學(xué)到了英語口語的語匯、短語、句子結(jié)構(gòu),以及表達(dá)各種內(nèi)容的說法。你要做的就是把自己想像成電影中的一個(gè)角色,在經(jīng)歷著自己的生活,又在經(jīng)歷著其他人
的生活。總之,看一部電影比在美國生活一天還好,看電影也能學(xué)到地道的英語口語。
【第四篇】
當(dāng)代社會是個(gè)開放社會,信息社會,人們越來越重視交際,而我國改革開放的成功也日益提高了我國在世界上的地位,我們與世界各國交流的領(lǐng)域越來越廣了,沒有出眾的英語口語表達(dá)將會寸步難行。
而要提高英語口語表達(dá)能力,就要先了解英語口語表達(dá)的過程是怎樣發(fā)生的。大家知道,語言是思維的外殼。口語表達(dá)的過程,實(shí)際上是一個(gè)復(fù)雜的心理和生理過程,是思維借助詞語按一定句式迅速轉(zhuǎn)換為有聲言語的過程。因此,口語能力的強(qiáng)弱取決于:
1、思維能力的強(qiáng)弱,特別是與口語有關(guān)的思維的條理性、敏銳性與靈活性,這是關(guān)鍵。
2、準(zhǔn)確、迅速地組織言語(選詞、造句、組段、構(gòu)篇)能力的強(qiáng)弱,這是基礎(chǔ)。
3、運(yùn)用語言的能力的強(qiáng)弱,這是前提。
根據(jù)口語表達(dá)循序漸進(jìn)的一般規(guī)律,口語訓(xùn)練的重點(diǎn)應(yīng)是培養(yǎng)敏銳的思維和強(qiáng)烈的語感。具體包括:
1、語音。學(xué)會科學(xué)發(fā)聲方法,能用準(zhǔn)確、響亮、流暢的英語進(jìn)行口頭表達(dá)。
2、語調(diào)。能借助聲音高低升降、抑揚(yáng)頓挫的變化來表達(dá)復(fù)雜的感情,掌握停連和輕重、抑揚(yáng)和明暗、快慢和松緊等一般的朗讀技巧。
3、詞匯。能掌握比較豐富的口語詞匯。
4、語脈。說話能做到有條有理、語言流暢、上下貫通、一脈相承。
5、語境。說話注意目的、對象、場合,合乎規(guī)定情景的要求,講禮貌、有針對性。懂得口語修辭。在會話中有隨機(jī)應(yīng)變的能力。
此外,還要懂得口頭言語的輔助手段--表情、姿勢、動作等態(tài)勢言語的運(yùn)用。
由于書面語和口語是相互滲透、相互促進(jìn)的,為提高口語的表現(xiàn)力,可在說話訓(xùn)練之前先進(jìn)行一章朗讀、朗誦訓(xùn)練。聽和說是一個(gè)事物的兩個(gè)方面,吸收、表達(dá)
兩者不能偏廢,所以口語訓(xùn)練體系中也應(yīng)包括。通過以上訓(xùn)練,掌握一定的朗讀朗誦技巧,培養(yǎng)準(zhǔn)確、流利、有感情地朗讀朗誦一般作品的能力,特別注意培養(yǎng)強(qiáng)烈
的語感。
3、聽力訓(xùn)練
培養(yǎng)聽的注意力、理解力、記憶力和辨析力,提高聽知能力,養(yǎng)成良好的聽的習(xí)慣。
4、口語表達(dá)基本方式訓(xùn)練
進(jìn)行敘述、描述、評述、解說等口語表達(dá)基本方式的訓(xùn)練,培養(yǎng)內(nèi)部言語向外部言語迅速轉(zhuǎn)化的能力,結(jié)合進(jìn)行語調(diào)、語脈的訓(xùn)練。
5、會話型言語訓(xùn)練
言語形式有會話型和獨(dú)白型兩類。會話是指兩個(gè)以上的人圍繞一個(gè)或幾個(gè)話題一起說話的形式,如交談、座談、辯論、審訊等。會話時(shí)參加者是互為聽、講者
的,因此后面的發(fā)言常常受到前面發(fā)言的制約。另外,由于當(dāng)面交談,大量態(tài)勢語代替了言語表達(dá),會話者的言語結(jié)構(gòu)往往不嚴(yán)謹(jǐn)、不完善,省略句較多。
可進(jìn)行如下訓(xùn)練:通過交談和辯論兩種會話言語訓(xùn)練,了解它們的一般特點(diǎn)、注意事項(xiàng),結(jié)合進(jìn)行應(yīng)變能力和禮貌用語的訓(xùn)練,從而在會話中有效地培養(yǎng)隨機(jī)應(yīng)變的能力。
6、獨(dú)白型言語訓(xùn)練
獨(dú)白是指一個(gè)人單獨(dú)發(fā)言而其他人都作為聽眾的言語表達(dá)形式,如:講故事、作報(bào)告、講課、演講、講解員的解說等。獨(dú)白言語一般不在進(jìn)行過程中跟聽眾問答
交流,因此要求在事先要周密地了解聽眾的要求并系統(tǒng)地組織好發(fā)言內(nèi)容和有關(guān)態(tài)勢語。獨(dú)白是一種高層次的言語形式。
可通過講故事和演講兩種獨(dú)白言語的訓(xùn)練,了解它們的一般特點(diǎn)、注意事項(xiàng),結(jié)合進(jìn)行運(yùn)用態(tài)勢語的訓(xùn)練,這類訓(xùn)練很有利于培養(yǎng)思維的條理性和連貫性。
7、即興小品訓(xùn)練
即興小品要求表演者按照規(guī)定的題目和要求,在規(guī)定的時(shí)間內(nèi),充分發(fā)揮自己的想象,不用或少用道具,通過言語和動作的表演,展現(xiàn)社會生活中的某個(gè)瞬間或片斷,表達(dá)一個(gè)簡單的主題。
嚴(yán)格地說,小品應(yīng)該是話劇藝術(shù)表演訓(xùn)練的一種形式,但由于它具有綜合的特點(diǎn),對訓(xùn)練思維的創(chuàng)造性、敏捷性、條理性、言語表達(dá)的準(zhǔn)確性、形象性、流暢
性,以及應(yīng)變力,乃至姿勢的綜合運(yùn)用等等,都有很大的好處,所以我們要想英語口語表達(dá)能力更上一個(gè)層次,這種形式的訓(xùn)練也要加以采用。
懂得了英語口語表達(dá)的規(guī)律,并不等于就有了一口流暢的英語表達(dá)口才,就好象讀了介紹游泳的書并不等于一定會游泳一樣,關(guān)鍵還是要在長期的時(shí)實(shí)踐中持之
以恒地艱苦磨練。這種訓(xùn)練不同于我們平時(shí)常聽常說的那種日常英語口語訓(xùn)練。日常的英語口語訓(xùn)練與之相比簡單得多,所用的詞匯量及話題所涉及的深度都是相當(dāng)
有限的。而真正高層次的英語口語交際所需達(dá)到的流暢性、條理性、敏銳性和靈活性并不是常練一些日常用語就能達(dá)到的,其中用到的詞匯量也因話題的深入和多樣
而大大增加了。
所以,要想真正地提高英語口語,說一口流利而又有水平的交際英語,得有對英語口語表達(dá)感興趣作為前提,懂得以上的規(guī)律,重視運(yùn)用以上的訓(xùn)練步驟,加上
長期的艱苦訓(xùn)練,才會有成效,才會達(dá)到目的。聽力訓(xùn)練,當(dāng)然,在訓(xùn)練過程中,聽和說是無法截然分開的。
因此,英語口語訓(xùn)練體系可按以下順序安排:
1、語音訓(xùn)練
在學(xué)習(xí)英語語音知識的基礎(chǔ)上加強(qiáng)語音訓(xùn)練,進(jìn)行方音辨正練習(xí)。通過學(xué)習(xí),打好英語語音知識,有一定的辨音能力,能用英語正確、清楚、響亮地表達(dá)。
2、朗讀朗誦訓(xùn)練
進(jìn)行呼吸、發(fā)聲與共鳴訓(xùn)練,吐字納音的訓(xùn)練,以及各種朗讀朗誦技巧的訓(xùn)練,學(xué)會常用文體的朗讀、朗誦,懂得在朗誦中恰當(dāng)使用態(tài)勢語
1 )輪詢均衡策略的配置
進(jìn)入Apache的conf目錄,打開httpd.conf文件,在文件的末尾加入:
ProxyPass / balancer://proxy/ #注意這里以"/"結(jié)尾
<Proxy balancer://proxy>
BalancerMember http://192.168.6.37:6888/
BalancerMember http://192.168.6.38:6888/
</Proxy>
我們來觀察上述的參數(shù)“ProxyPass / balancer://proxy/”,其中,“ProxyPass”是配置虛擬服務(wù)器的命令,“/”代表發(fā)送Web請求的URL前綴,如:http://myserver/或者h(yuǎn)ttp://myserver/aaa,這些URL都將符合上述過濾條件;“balancer://proxy/”表示要配置負(fù)載均衡,proxy代表負(fù)載均衡名;BalancerMember 及其后面的URL表示要配置的后臺服務(wù)器,其中URL為后臺服務(wù)器請求時(shí)的URL。以上面的配置為例,實(shí)現(xiàn)負(fù)載均衡的原理如下:
假設(shè)Apache接收到http://localhost/aaa請求,由于該請求滿足ProxyPass條件(其URL前綴為“/”),該請求會被分發(fā)到后臺某一個(gè)BalancerMember,譬如,該請求可能會轉(zhuǎn)發(fā)到 http://192.168.6.37:6888/aaa進(jìn)行處理。當(dāng)?shù)诙€(gè)滿足條件的URL請求過來時(shí),該請求可能會被分發(fā)到另外一臺BalancerMember,譬如,可能會轉(zhuǎn)發(fā)到http://192.168.6.38:6888/。如此循環(huán)反復(fù),便實(shí)現(xiàn)了負(fù)載均衡的機(jī)制。
2) 按權(quán)重分配均衡策略的配置
ProxyPass / balancer://proxy/ #注意這里以"/"結(jié)尾
<Proxy balancer://proxy>
BalancerMember http://192.168.6.37:6888/ loadfactor=3
BalancerMember http://192.168.6.38:6888/ loadfactor=1
</Proxy>
參數(shù)”loadfactor”表示后臺服務(wù)器負(fù)載到由Apache發(fā)送請求的權(quán)值,該值默認(rèn)為1,可以將該值設(shè)置為1到100之間的任何值。以上面的配置
為例,介紹如何實(shí)現(xiàn)按權(quán)重分配的負(fù)載均衡,現(xiàn)假設(shè)Apache收到http://myserver/aaa
4次這樣的請求,該請求分別被負(fù)載到后臺服務(wù)器,則有3次連續(xù)的這樣請求被負(fù)載到BalancerMember為http://192.168.6.37:6888的服務(wù)器,有1次這樣的請求被負(fù)載BalancerMember為http://192.168.6.38:6888后臺服務(wù)器。實(shí)現(xiàn)了按照權(quán)重連續(xù)分配的均衡策略。
3) 權(quán)重請求響應(yīng)負(fù)載均衡策略的配置
ProxyPass / balancer://proxy/ lbmethod=bytraffic #注意這里以"/"結(jié)尾
<Proxy balancer://proxy>
BalancerMember http://192.168.6.37:6888/ loadfactor=3
BalancerMember http://192.168.6.38:6888/ loadfactor=1
</Proxy>
參數(shù)“l(fā)bmethod=bytraffic”表示后臺服務(wù)器負(fù)載請求和響應(yīng)的字節(jié)數(shù),處理字節(jié)數(shù)的多少是以權(quán)值的方式來表示的。
“l(fā)oadfactor”表示后臺服務(wù)器處理負(fù)載請求和響應(yīng)字節(jié)數(shù)的權(quán)值,該值默認(rèn)為1,可以將該值設(shè)置在1到100的任何值。根據(jù)以上配置是這么進(jìn)行均
衡負(fù)載的,假設(shè)Apache接收到http://myserver/aaa請求,將請求轉(zhuǎn)發(fā)給后臺服務(wù)器,如果BalancerMember為http://192.168.6.37:6888后臺服務(wù)器負(fù)載到這個(gè)請求,那么它處理請求和響應(yīng)的字節(jié)數(shù)是BalancerMember為http://192.168.6.38:6888 服務(wù)器的3倍(回想(2)均衡配置,(2)是以請求數(shù)作為權(quán)重負(fù)載均衡的,(3)是以流量為權(quán)重負(fù)載均衡的,這是最大的區(qū)別)。
看明白了沒有,根據(jù)不同的需要,可以按這三種方式進(jìn)行配置。我按照第三種配置的,感覺上這種對于負(fù)載的均衡更全面合理。我的配置很簡單,如下:
先配置均衡器:
<Proxy balancer://proxy>
BalancerMember ajp://127.0.0.1:8009/ loadfactor=1
BalancerMember http://192.168.10.6:8083/ loadfactor=1
</Proxy>
其中http://192.168.10.6:8083實(shí)際上是另外一個(gè)端口啟動的apache,為了測試,它就簡單的直接轉(zhuǎn)發(fā)所有請求到tomcat。
對于上次的VirtualHost進(jìn)行以下的修改即可:
<VirtualHost *:80>
ServerName www.test.com
DocumentRoot /www
DirectoryIndex index.html index.jsp
<Directory "/www">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory "/control">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
ProxyPass /nxt/images/ !
ProxyPass /nxt/js/ !
ProxyPass /nxt/css/ !
#ProxyPass / ajp://127.0.0.1:8009/
#ProxyPassReverse / ajp://127.0.0.1:8009/
ProxyPass / balancer://proxy/
ProxyPassReverse / balancer://proxy/
</VirtualHost>
注釋掉之前的ajp轉(zhuǎn)發(fā),而配置成通過balancer去處理。
通過觀察access log,的確有部分請求發(fā)送到了8083端口的apache上,而有部分是直接ajp轉(zhuǎn)發(fā)到tomcat上了。對于更多的負(fù)載均衡的參數(shù)檢測,待空了再做。
一、集群和負(fù)載均衡的概念
(一)集群的概念
集群(Cluster)是由兩臺或多臺節(jié)點(diǎn)機(jī)(服務(wù)器)構(gòu)成的一種松散耦合的計(jì)算節(jié)點(diǎn)集合,為用
戶提供網(wǎng)絡(luò)服務(wù)或應(yīng)用程序(包括數(shù)據(jù)庫、Web服務(wù)和文件服務(wù)等)的單一客戶視圖,同時(shí)提供接近容錯(cuò)機(jī)的故障恢復(fù)能力。集群系統(tǒng)一般通過兩臺或多臺節(jié)點(diǎn)服
務(wù)器系統(tǒng)通過相應(yīng)的硬件及軟件互連,每個(gè)群集節(jié)點(diǎn)都是運(yùn)行其自己進(jìn)程的獨(dú)立服務(wù)器。這些進(jìn)程可以彼此通信,對網(wǎng)絡(luò)客戶機(jī)來說就像是形成了一個(gè)單一系統(tǒng),協(xié)
同起來向用戶提供應(yīng)用程序、系統(tǒng)資源和數(shù)據(jù)。除了作為單一系統(tǒng)提供服務(wù),集群系統(tǒng)還具有恢復(fù)服務(wù)器級故障的能力。集群系統(tǒng)還可通過在集群中繼續(xù)增加服務(wù)器
的方式,從內(nèi)部增加服務(wù)器的處理能力,并通過系統(tǒng)級的冗余提供固有的可靠性和可用性。
(二)集群的分類
1、高性能計(jì)算科學(xué)集群:
以解決復(fù)雜的科學(xué)計(jì)算問題為目的的IA集群系統(tǒng)。是并行計(jì)算的基礎(chǔ),它可以不使用專門的由十至上萬個(gè)獨(dú)立處理器組成的并行超級計(jì)算機(jī),而是采用通過高速
連接來鏈接的一組1/2/4
CPU的IA服務(wù)器,并且在公共消息傳遞層上進(jìn)行通信以運(yùn)行并行應(yīng)用程序。這樣的計(jì)算集群,其處理能力與真正超級并行機(jī)相等,并且具有優(yōu)良的性價(jià)比。
2、負(fù)載均衡集群:
負(fù)載均衡集群為企業(yè)需求提供更實(shí)用的系統(tǒng)。該系統(tǒng)使各節(jié)點(diǎn)的負(fù)載流量可以在服務(wù)器集群中盡可能平均合理地分?jǐn)偺幚怼T撠?fù)載需要均衡計(jì)算的應(yīng)用程序處理端
口負(fù)載或網(wǎng)絡(luò)流量負(fù)載。這樣的系統(tǒng)非常適合于運(yùn)行同一組應(yīng)用程序的大量用戶。每個(gè)節(jié)點(diǎn)都可以處理一部分負(fù)載,并且可以在節(jié)點(diǎn)之間動態(tài)分配負(fù)載,以實(shí)現(xiàn)平
衡。對于網(wǎng)絡(luò)流量也如此。通常,網(wǎng)絡(luò)服務(wù)器應(yīng)用程序接受了大量入網(wǎng)流量,無法迅速處理,這就需要將流量發(fā)送給在其它節(jié)點(diǎn)。負(fù)載均衡算法還可以根據(jù)每個(gè)節(jié)點(diǎn)
不同的可用資源或網(wǎng)絡(luò)的特殊環(huán)境來進(jìn)行優(yōu)化。
3、高可用性集群:
為保證集群整體服務(wù)的高可用,考慮計(jì)算硬件和軟件的容錯(cuò)性。如果高可用性群集中的某個(gè)節(jié)點(diǎn)發(fā)生了故障,那么將由另外的節(jié)點(diǎn)代替它。整個(gè)系統(tǒng)環(huán)境對于用戶是一致的。
實(shí)際應(yīng)用的集群系統(tǒng)中,這三種基本類型經(jīng)常會發(fā)生混合與交雜。
(三)典型集群
科學(xué)計(jì)算集群:
1、Beowulf
當(dāng)談到 Linux
集群時(shí),許多人的第一反映是 Beowulf。那是最著名的 Linux科學(xué)軟件集群系統(tǒng)。實(shí)際上,它是一組適用于在 Linux
內(nèi)核上運(yùn)行的公共軟件包的通稱。其中包括流行的軟件消息傳遞 API,如“消息傳送接口”(MPI) 或“并行虛擬機(jī)”(PVM),對 Linux
內(nèi)核的修改,以允許結(jié)合幾個(gè)以太網(wǎng)接口、高性能網(wǎng)絡(luò)驅(qū)動器,對虛擬內(nèi)存管理器的更改,以及分布式進(jìn)程間通信 (DIPC)
服務(wù)。公共全局進(jìn)程標(biāo)識空間允許使用 DIPC 機(jī)制從任何節(jié)點(diǎn)訪問任何進(jìn)程。
2、MOSIX
Beowulf類似于給系統(tǒng)安裝的一個(gè)支持
集群的外掛軟件,提供了應(yīng)用級的集群能力。而MOSIX是徹底修改Linux的內(nèi)核,從系統(tǒng)級提供了集群能力,它對應(yīng)用而言是完全透明的,原有的應(yīng)用程
序,可以不經(jīng)改動,就能正常運(yùn)行在MOSIX系統(tǒng)之上。集群中的任何節(jié)點(diǎn)都可以自由地加入和移除,來接替其它節(jié)點(diǎn)的工作,或是擴(kuò)充系統(tǒng)。MOSIX
使用自適應(yīng)進(jìn)程負(fù)載均衡和內(nèi)存引導(dǎo)算法使整體性能最大化。應(yīng)用程序進(jìn)程可以在節(jié)點(diǎn)之間實(shí)現(xiàn)遷移,以利用最好的資源,這類似于對稱多處理器系統(tǒng)可以在各個(gè)處
理器之間切換應(yīng)用程序。由于MOSIX通過修改內(nèi)核來實(shí)現(xiàn)集群功能,所以存在兼容性問題,部分系統(tǒng)級應(yīng)用程序?qū)o法正常運(yùn)行。
負(fù)載均衡/高可用性集群
3、LVS(Linux Virtual Server)
這是一個(gè)由國人主持的項(xiàng)目。
它是一個(gè)負(fù)載均衡/高可用性集群,主要針對大業(yè)務(wù)量的網(wǎng)絡(luò)應(yīng)用(如新聞服務(wù)、網(wǎng)上銀行、電子商務(wù)等)。
LVS
是建立在一個(gè)主控服務(wù)器(通常為雙機(jī))(director)及若干真實(shí)服務(wù)器(real-server)所組成的集群之上。real-server負(fù)責(zé)實(shí)
際提供服務(wù),主控服務(wù)器根據(jù)指定的調(diào)度算法對real-server進(jìn)行控制。而集群的結(jié)構(gòu)對于用戶來說是透明的,客戶端只與單個(gè)的IP(集群系統(tǒng)的虛擬
IP)進(jìn)行通信,也就是說從客戶端的視角來看,這里只存在單個(gè)服務(wù)器。
N54537Real-server可以提供眾多服務(wù),如ftp,
http, dns, telnet, nntp, smtp
等。主控服務(wù)器負(fù)責(zé)對Real-Server進(jìn)行控制。客戶端在向LVS發(fā)出服務(wù)請求時(shí),Director會通過特定的調(diào)度算法來指定由某個(gè)Real-
Server來應(yīng)答請求,而客戶端只與Load Balancer的IP(即虛擬IP,VIP)進(jìn)行通信。
其他集群:
現(xiàn)在集群系統(tǒng)可謂五花八門,絕大部分的OS開發(fā)商,服務(wù)器開發(fā)商都提供了系統(tǒng)級的
集群產(chǎn)品,最典型的是各類雙機(jī)系統(tǒng),還有各類科研院校提供的集群系統(tǒng)。以及各類軟件開發(fā)商提供的應(yīng)用級別的集群系統(tǒng),如數(shù)據(jù)庫集
群,Application Server 集群,Web Server集群,郵件集群等等。
(四)負(fù)載均衡
1、概念
由于目前現(xiàn)有網(wǎng)絡(luò)的各個(gè)核心部分隨著業(yè)務(wù)量的提高,訪問量和數(shù)據(jù)流量的快速增長,其處理能力和計(jì)算強(qiáng)度也相應(yīng)地增大,使得單一的服務(wù)器設(shè)備根本無法承擔(dān)。
在此情況下,如果扔掉現(xiàn)有設(shè)備去做大量的硬件升級,這樣將造成現(xiàn)有資源的浪費(fèi),而且如果再面臨下一次業(yè)務(wù)量的提升時(shí),這又將導(dǎo)致再一次硬件升級的高額成本
投入,甚至性能再卓越的設(shè)備也不能滿足當(dāng)前業(yè)務(wù)量增長的需求。
針對此情況而衍生出來的一種廉價(jià)有效透明的方法以擴(kuò)展現(xiàn)有網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬、增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性的技術(shù)就是負(fù)載均衡(Load Balance)。
2、特點(diǎn)和分類
負(fù)載均衡(Server Load Balance)一般用于提高服務(wù)器的整體處理能力,并提高可靠性,可用性,可維護(hù)性,最終目的是加快服務(wù)器的響應(yīng)速度,從而提高用戶的體驗(yàn)度。
負(fù)載均衡從結(jié)構(gòu)上分為本地負(fù)載均衡(Local Server Load Balance)和地域負(fù)載均衡(Global Server Load
Balance)(全局負(fù)載均衡),一是指對本地的服務(wù)器群做負(fù)載均衡,另一是指對分別放置在不同的地理位置、有不同的網(wǎng)絡(luò)及服務(wù)器群之間作負(fù)載均衡。
地域負(fù)載均衡有以下的特點(diǎn):
(1)解決網(wǎng)絡(luò)擁塞問題,服務(wù)就近提供,實(shí)現(xiàn)地理位置無關(guān)性
(2)對用戶提供更好的訪問質(zhì)量
(3)提高服務(wù)器響應(yīng)速度
(4)提高服務(wù)器及其他資源的利用效率
(5)避免了數(shù)據(jù)中心單點(diǎn)失效
3、負(fù)載均衡技術(shù)主要應(yīng)用
(1)DNS負(fù)載均衡
最早的負(fù)載均衡技術(shù)是通過DNS來實(shí)現(xiàn)的,在DNS中為多個(gè)地址配置同一個(gè)名字,因而查詢這個(gè)名字的客戶機(jī)將得到其中一個(gè)地址,從而使得不同的客戶訪問不
同的服務(wù)器,達(dá)到負(fù)載均衡的目的。DNS負(fù)載均衡是一種簡單而有效的方法,但是它不能區(qū)分服務(wù)器的差異,也不能反映服務(wù)器的當(dāng)前運(yùn)行狀態(tài)。
(2)代理服務(wù)器負(fù)載均衡 使用代理服務(wù)器,可以將請求轉(zhuǎn)發(fā)給內(nèi)部的服務(wù)器,使用這種加速模式顯然可以提升靜態(tài)網(wǎng)頁的訪問速度。然而,也可以考慮這樣一種技術(shù),使用代理服務(wù)器將請求均勻轉(zhuǎn)發(fā)給多臺服務(wù)器,從而達(dá)到負(fù)載均衡的目的。
(3)地址轉(zhuǎn)換網(wǎng)關(guān)負(fù)載均衡 支持負(fù)載均衡的地址轉(zhuǎn)換網(wǎng)關(guān),可以將一個(gè)外部IP地址映射為多個(gè)內(nèi)部IP地址,對每次TCP連接請求動態(tài)使用其中一個(gè)內(nèi)部地址,達(dá)到負(fù)載均衡的目的。
(4)協(xié)議內(nèi)部支持負(fù)載均衡 除了這三種負(fù)載均衡方式之外,有的協(xié)議內(nèi)部支持與負(fù)載均衡相關(guān)的功能,例如HTTP協(xié)議中的重定向能力等,HTTP運(yùn)行于TCP連接的最高層。
(5)NAT
負(fù)載均衡 NAT(Network Address Translation
網(wǎng)絡(luò)地址轉(zhuǎn)換)簡單地說就是將一個(gè)IP地址轉(zhuǎn)換為另一個(gè)IP地址,一般用于未經(jīng)注冊的內(nèi)部地址與合法的、已獲注冊的Internet
IP地址間進(jìn)行轉(zhuǎn)換。適用于解決Internet IP地址緊張、不想讓網(wǎng)絡(luò)外部知道內(nèi)部網(wǎng)絡(luò)結(jié)構(gòu)等的場合下。
(6)反向代理負(fù)載均
衡
普通代理方式是代理內(nèi)部網(wǎng)絡(luò)用戶訪問internet上服務(wù)器的連接請求,客戶端必須指定代理服務(wù)器,并將本來要直接發(fā)送到internet上服務(wù)器的連
接請求發(fā)送給代理服務(wù)器處理。反向代理(Reverse
Proxy)方式是指以代理服務(wù)器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給
internet上請求連接的客戶端,此時(shí)代理服務(wù)器對外就表現(xiàn)為一個(gè)服務(wù)器。反向代理負(fù)載均衡技術(shù)是把將來自internet上的連接請求以反向代理的
方式動態(tài)地轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的多臺服務(wù)器進(jìn)行處理,從而達(dá)到負(fù)載均衡的目的。
(7)混合型負(fù)載均衡
在有些大型網(wǎng)絡(luò),由于多個(gè)服務(wù)器群內(nèi)硬件設(shè)備、各自的規(guī)模、提供的服務(wù)等的差異,我們可以考慮給每個(gè)服務(wù)器群采用最合適的負(fù)載均衡方式,然后又在這多個(gè)服
務(wù)器群間再一次負(fù)載均衡或群集起來以一個(gè)整體向外界提供服務(wù)(即把這多個(gè)服務(wù)器群當(dāng)做一個(gè)新的服務(wù)器群),從而達(dá)到最佳的性能。我們將這種方式稱之為混合
型負(fù)載均衡。此種方式有時(shí)也用于單臺均衡設(shè)備的性能不能滿足大量連接請求的情況下。
二、搭建集群和實(shí)現(xiàn)負(fù)載平衡
(一)前期準(zhǔn)備
我的系統(tǒng)用的是windowsXP專業(yè)版,我要做的是,用一個(gè)apache和多個(gè)(這里以兩個(gè)作為示例)tomcat,通過jk方式,構(gòu)造一個(gè)集群。以下是要首先準(zhǔn)備的東西:
1、jdk,我用的版本是jdk1.5.0_06,下載地址是http://192.18.108.216/ECom/EComTicketServlet/BEGIND597A309654D73D910E051D73D539D5F/-2147483648/2438196255/1/852050/851882/2438196255/2ts+/westCoastFSEND/jdk-1.5.0_13-oth-JPR/jdk-1.5.0_13-oth-JPR:3/jdk-1_5_0_13-windows-i586-p.exe
2、apache,我用的版本是2.2.4,下載地址是http://apache.justdn.org/httpd/binaries/win32/apache_2.2.4-win32-x86-openssl-0.9.8d.msi
3、tomcat,我用的版本是5.5的解壓版本,這里要注意:不能用安裝的版本,因?yàn)橐慌_機(jī)器上裝兩個(gè)一樣的tomcat,是會出錯(cuò)誤的。下載地址是http://apache.mirror.phpchina.com/tomcat/tomcat-5/v5.5.25/bin/apache-tomcat-5.5.25.zip
4、jk,這個(gè)jk的版本,本來有兩個(gè)的,但是版本2已經(jīng)被廢棄掉了,目前可用的jk版本是1.2.25。每個(gè)apache的版本,都會有一個(gè)特定的jk與之對應(yīng),所以這里要用的jk也必須是為apache-2.2.4開發(fā)的那個(gè)才行。它的下載地址是http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.25/mod_jk-apache-2.2.4.so
有了這四樣?xùn)|西,我們就可以開始做集群了。
(二)安裝
1、相信需要看這篇文章的人,JDK的安裝一定不會陌生,這里不在贅述。只是需要提醒一下:環(huán)境變量別忘記配置了。
2、安裝apache也沒有什么難度,就是在安裝過程中要配置域名、網(wǎng)址和管理員郵箱之類的信息,這 個(gè)信息完全可以按照提示,然后修改下填入即可,之后想修改的話直接到配置文件中改就行了。除了這個(gè)地方,還要保證機(jī)器上的80端口沒有被其他程序占用。至 于安裝路徑,完全取決于個(gè)人愛好。其他的默認(rèn)就行了。安裝成功后,系統(tǒng)右下角的托盤區(qū)會有個(gè)圖標(biāo),我們可以通過這個(gè)啟動apache,如果那個(gè)小紅點(diǎn)變成 綠色,說明服務(wù)已經(jīng)正常啟動了(如果服務(wù)沒有啟動起來,說明安裝過程中的配置有錯(cuò)誤,建議卸載后重裝)。如果按照默認(rèn),端口是80的話,那打開瀏覽器,輸 入:http://localhost/ ,應(yīng)該可以看到 " It works “的字樣。這樣就可以進(jìn)入下一步了。
3、解壓縮tomcat,記得要做兩份。這里不妨將兩個(gè)tomcat命名為:tomcat- 5.5.25_1和tomcat-5.5.25_2,其實(shí)這兩個(gè)文件夾中的東西是完全一樣的。但是我為了在同一臺機(jī)器上做集群,那就要保證兩個(gè) tomcat運(yùn)行起來不會在端口上起沖突。進(jìn)入tomcat-5.5.25_1/conf目錄,用文本編輯器打開并修改server.xml,將該 tomcat的默認(rèn)8080端口改為8088(其實(shí)沒必要改,我改這個(gè)是因?yàn)槲覚C(jī)器上還有其他tomcat占用著8080端口)。然后進(jìn)入tomcat- 5.5.25_2/conf目錄,同樣將8080修改掉,至于改成多少沒多大關(guān)系,只要不占用其他程序的端口,應(yīng)該不會出什么問題。這樣,tomcat就 算安裝好了。
4、jk這東西是一個(gè)連接模塊,不用安裝,直接將mod_jk-apache-2.2.4.so這個(gè)文件拷貝到apache安裝目錄下的modules文件夾下面就行了。
這樣,安裝完成,下面開始配置。
(三)配置
這個(gè)地方才是搭建集群的關(guān)鍵所在,我也會盡我的可能寫的詳細(xì)點(diǎn)。
1、配置tomcat
為防止沖突,進(jìn)入第二個(gè)tomcat主目錄,然后進(jìn)入conf目錄,打開server.xml修改配 置。主要是修改端口,我這里把所有的端口信息,都在原有基礎(chǔ)上加1000,即原端口是8009,我改為9009。當(dāng)然,你不必和我一樣,只要保證不沖突就 OK!這些配置在apache的配置中可能會用到。
2、配置apache
(1)進(jìn)入apache的主目錄,然后進(jìn)入conf文件夾,用文本編輯器打開httpd.conf,在該文件末尾加上如下幾行:
### 加載 mod_jk 模塊
LoadModule jk_module modules/mod_jk-apache-2.2.4.so
### 配置 mod_jk
JkWorkersFile conf/workers.properties #加載集群中的workers
JkMountFile conf/uriworkermap.properties #加載workers的請求處理分配文件
JkLogFile logs/mod_jk.log #指定jk的日志輸出文件
JkLogLevel warn #指定日志級別
(2)不要改變目錄,新建一個(gè)文件:workers.properties,該文件用來配置web容器的信息。該文件的內(nèi)容如下:
# worker列表
worker.list=controller, status
#第一個(gè)server的配置,server名為s1
#ajp13 端口號,在tomcat下server.xml配置,默認(rèn)8009
worker.s1.port=8009
#tomcat的主機(jī)地址,如不為本機(jī),請?zhí)顚慽p地址
worker.s1.host=localhost
worker.s1.type=ajp13
#server的加權(quán)比重,值越高,分得的請求越多
worker.s1.lbfactor=1
#第二個(gè)server的配置,server名為s2
worker.s2.port=9009
worker.s2.host=localhost
worker.s2.type=ajp13
worker.s2.lbfactor=1
#server名為controller,用于負(fù)載均衡
worker.controller.type=lb
worker.retries=3 #重試次數(shù)
#指定分擔(dān)請求的server列表,用逗號分隔
worker.controller.balanced_workers=s1,s2
#設(shè)置用于負(fù)載均衡的server的session可否共享 有不少文章說設(shè)置為1是可以的,但是我是設(shè)置為0才可以的
worker.controller.sticky_session=0
#worker.controller.sticky_session_force=1
worker.status.type=status
(3)不要改變目錄,新建一個(gè)文件:uriworkermap.properties,文件內(nèi)容如下:
/*=controller #所有請求都由controller這個(gè)server處理
/jkstatus=status #所有包含jkstatus請求的都由status這個(gè)server處理
!/*.gif=controller #所有以.gif結(jié)尾的請求都不由controller這個(gè)server處理,以下幾個(gè)都是一樣的意思
!/*.jpg=controller
!/*.png=controller
!/*.css=controller
!/*.js=controller
!/*.htm=controller
!/*.html=controller
這里的"!”類似于java中的"!”,是“非”的意思。
這樣,apache一塊就配置好了。
3、再修改tomcat配置:這里兩個(gè)tomcat都要配置。
仍然是打開第一步中的那個(gè)server.xml文件,找到<Engine name="Catalina" defaultHost="localhost">這一行,在里面加上一句:jvmRoute="s1",即把該句改為:<Engine name="Catalina" defaultHost="localhost" jvmRoute="s1">。這里的s1就是第二步中配置的用于負(fù)載均衡的server的名稱。如果該tomcat的端口是第二步中s1用的端 口,那這里就寫s1,第二個(gè)tomcat就應(yīng)該是s2了。
這樣,配置就完成了。
(四)運(yùn)行
進(jìn)入兩個(gè)tomcat的bin目錄,執(zhí)行兩個(gè)tomcat的startup.bat啟動這兩個(gè) tomcat,然后將apache重新啟動后,運(yùn)行起來看看效果吧。如果不出意外,兩個(gè)tomcat的窗口應(yīng)該是你一次我一次的打印日志信息了,而且此時(shí) session也是共享了的。
到這里,集群搭建好了,負(fù)載均衡也實(shí)現(xiàn)了。
j:=0;
for i:=1 to n do
begin
while (j>0) and (B[j+1]<>A[i]) do j:=P[j];
if B[j+1]=A[i] then j:=j+1;
if j=m then
begin
writeln('Pattern occurs with shift ',i-m);
j:=P[j];
end;
end;
P[1]:=0;
j:=0;
for i:=2 to m do
begin
while (j>0) and (B[j+1]<>B[i]) do j:=P[j];
if B[j+1]=B[i] then j:=j+1;
P[i]:=j;
end;
Matrix67原創(chuàng)
模式字母(所有其他字符 'A'
到 'Z'
和 'a'
到
'z'
都被保留):
模式字母通常是重復(fù)的,其數(shù)量確定其精確表示:
字母 日期或時(shí)間元素 表示 示例 G
Era 標(biāo)志符 Text AD
y
年 Year 1996
;96
M
年中的月份 Month July
;Jul
;07
w
年中的周數(shù) Number 27
W
月份中的周數(shù) Number 2
D
年中的天數(shù) Number 189
d
月份中的天數(shù) Number 10
F
月份中的星期 Number 2
E
星期中的天數(shù) Text Tuesday
;Tue
a
Am/pm 標(biāo)記 Text PM
H
一天中的小時(shí)數(shù)(0-23) Number 0
k
一天中的小時(shí)數(shù)(1-24) Number 24
K
am/pm 中的小時(shí)數(shù)(0-11) Number 0
h
am/pm 中的小時(shí)數(shù)(1-12) Number 12
m
小時(shí)中的分鐘數(shù) Number 30
s
分鐘中的秒數(shù) Number 55
S
毫秒數(shù) Number 978
z
時(shí)區(qū) General time zone Pacific Standard Time
;PST
;GMT-08:00
Z
時(shí)區(qū) RFC 822 time zone -0800
日期和時(shí)間模式 結(jié)果 "yyyy.MM.dd G 'at' HH:mm:ss z"
2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy"
Wed, Jul 4, '01
"h:mm a"
12:08 PM
"hh 'o''clock' a, zzzz"
12 o'clock PM, Pacific Daylight Time
"K:mm a, z"
0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa"
02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z"
Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ"
010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
2001-07-04T12:08:56.235-0700
(一)
開門見山.今天我要說的是不用HQL執(zhí)行SAVE和DELETE方法,用hibernate的executeQuery來執(zhí)行SQL
其原理如下(從SessionFactory里獲得個(gè)Session,在調(diào)用session的connection方法,通過Statement來執(zhí)行靜態(tài)SQL,最后執(zhí)行executeQuery就可以了)具體如下:
protected Session session = null; protected Transaction tr = null;
String sql = "insert into as_dept2role(roleid,dept_id)value('"+roleId+"','"+deptId+"')"; session=HibernateSessionFactory.getSession();
session.beginTransaction();
//獲取connection,執(zhí)行靜態(tài)SQL
Statement state = session.connection().createStatement();
state.executeQuery(sql);
tr.commit(); session.close();
當(dāng)然關(guān)于 關(guān)閉SESSION 這些方法我寫的簡單些,主要是為了寫 執(zhí)行SQL這些方法
對于刪除只要寫個(gè)刪除語句就可以了
:Transaction tr = session.beginTransaction();
* session.connection() 方法過時(shí) 用下面來代替 *
DataSource ds= SessionFactoryUtils.getDataSource(getSessionFactory());
conn=ds.getConnection();
============================================
(二)
public Object get(Class cls, String szId) {
============================================
(三)
public List findWithSQL(final String sql) {
List list = (List) this.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws SQLException, HibernateException {
SQLQuery query = session.createSQLQuery(sql);
query.addScalar("NX",new org.hibernate.type.StringType());
List children = query.list();
return children;
}
});
return list;
}
/**
* 查詢并返回結(jié)果集,結(jié)果集中的內(nèi)容已經(jīng)都轉(zhuǎn)為了字符串
*/
public List<List<String>> findSql(final String sql) {
// TODO Auto-generated method stub
System.out.println("findSql---sql1----->"+sql);
List<List<String>> mainObjList=
(List<List<String>>) getHibernateTemplate().execute(new
HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
int n=-1;
Connection con=null;
PreparedStatement stmt=null;
ResultSet rs=null;
try
{
DataSource ds= SessionFactoryUtils.getDataSource(getSessionFactory());
if(ds==null)
{
throw new SQLException("get dataSource is null");
}
con=ds.getConnection();
System.out.println("findSql---sql2----->"+sql);
stmt=con.prepareStatement(sql);
rs=stmt.executeQuery();
} catch (HibernateException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
List<List<String>> list=new ArrayList<List<String>>();//每行為一個(gè)list
try
{
ResultSetMetaData rsmd=rs.getMetaData();
int colsNum=rsmd.getColumnCount();//取得列數(shù)
int rsNum=0;
while(rs.next())
{
rsNum++;
System.out.println("rsNum==="+rsNum+" ");
List<String> subList=new ArrayList<String> ();//每列的類型為string
for(int i=1;i<=colsNum;i++)
{
System.out.println("\ti==="+i);
//int type= rsmd.getColumnType(i);
String columnType=getDataType(rsmd.getColumnType(i),rsmd.getScale(i));
String val="";
if(columnType.equalsIgnoreCase("Date"))
{
Timestamp timest= rs.getTimestamp(i);
if(timest!=null)
{
long times=timest.getTime();
Date date=new Date(times);
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss",Locale.CHINA);
val=df.format(date);
}
}
else if(columnType.equalsIgnoreCase("Number"))
{
Object obj=rs.getObject(i);
if(obj!=null)
{
int m=rs.getInt(i);
val=Integer.toString(m);
}
}
else if(columnType.equalsIgnoreCase("blob"))
{
val="不支持blob數(shù)據(jù)的讀取";
}
else if(columnType.equalsIgnoreCase("clob"))
{
val=getOracleClobField(rs, i);
}
else
{
val=rs.getString(i);
}
if(val==null)
{
val="";
}
subList.add(val);
}
if(subList.size()>0)
{
list.add(subList);
}
}
}
catch(Exception ex5)
{
ex5.printStackTrace();
System.out.println("ex5.getMessage="+ex5.getMessage());
list=null;
}
finally
{
try {
if (rs != null) {
rs.close();
rs = null;
}
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
System.out.println("e2.getMessage="+e2.getMessage());
}
try {
if (stmt != null) {
stmt.close();
stmt = null;
}
} catch (Exception e3) {
// TODO: handle exception
e3.printStackTrace();
System.out.println("e3.getMessage="+e3.getMessage());
}
try {
if (con != null) {
con.close();
con = null;
}
} catch (Exception e4) {
// TODO: handle exception
e4.printStackTrace();
System.out.println("e4.getMessage="+e4.getMessage());
}
}
return list;
}
});
return mainObjList;
}
// String columnType=getDataType(rmd.getColumnType(i),rmd.getScale(i));
private String getOracleClobField(ResultSet rset, int index)
throws Exception
{
StringBuffer buffS = new StringBuffer();
Clob clob = rset.getClob(index + 1);
if(clob == null)
return " ";
Reader reader = clob.getCharacterStream();
char buff[] = new char[1024];
for(int len = 0; (len = reader.read(buff)) != -1;)
buffS.append(buff, 0, len);
return buffS.toString();
}
private static String getDataType(int type,int scale)
{
String dataType="";
switch(type){
case Types.LONGVARCHAR: //-1
dataType="Long";
break;
case Types.CHAR: //1
dataType="Character";
break;
case Types.NUMERIC: //2
switch(scale)
{
case 0:
dataType="Number";
break;
case -127:
dataType="Float";
break;
default:
dataType="Number";
}
break;
case Types.VARCHAR: //12
dataType="String";
break;
case Types.DATE: //91
dataType="Date";
break;
case Types.TIMESTAMP: //93
dataType="Date";
break;
case Types.BLOB :
dataType="Blob";
break;
default:
dataType="String";
}
return dataType;
}