拾貝殼

          走過的路
          隨筆 - 39, 文章 - 1, 評論 - 14, 引用 - 0
          數(shù)據(jù)加載中……

          JUDE還是很好用的

          ?? 沒有華麗的Rose,也沒有Togather,用JUDE的感覺也不錯.剛剛把PicoContainer反向了.可惜,好東西都陸續(xù)要收費(fèi)了.只能用用Community /Free 版.
          ?
          JUDE的一個下載地址:
          ?? http://jude.change-vision.com/jude-web/product/community.html

          posted @ 2006-07-23 15:27 binge 閱讀(898) | 評論 (1)編輯 收藏

          PicoContainer源碼導(dǎo)讀

               摘要: 一、簡介?? 感謝“簡易java框架”分享的學(xué)習(xí)心得。循著他的足跡,我把picocontainer讀了一遍。源代碼的版本是1.2-RC-2。?? pico的官方站點(diǎn):http://www.picocontainer.org/?? 由于它是一個專門的ioc容器,所以使用起來沒有spring那么麻煩。關(guān)于他的文檔,在官方站點(diǎn)上有一篇《5分鐘搞定pico》的文章。國人似乎也有很多的翻譯版本。講解得很詳細(xì)...  閱讀全文

          posted @ 2006-07-23 14:30 binge 閱讀(3019) | 評論 (0)編輯 收藏

          一個簡單的ThreadPool分析

          一個簡單的ThreadPool
          ? 原文來自http://www.informit.com/articles/printerfriendly.asp?p=30483&r1=1&rl=1
          ? 項(xiàng)目是多線程的,所以引入了線程池這個東西。池子是個老美寫的。在項(xiàng)目中表現(xiàn)的還不錯。所以把它摘出來,介紹給以后或許需要用到它的同行們。
          ? 關(guān)于為什么要采用ThreadPool,原文已經(jīng)提到了:創(chuàng)建一個線程是需要開銷的;如果線程數(shù)量過大的話,cpu就會浪費(fèi)很大的精力做線程切換。
          ? ThreadPool的實(shí)現(xiàn)過程就是對WorkerThread的同步和通信的管理過程。
          ? 我們來看代碼。
          ? 首先,在ThreadPool構(gòu)造的時候,創(chuàng)建10個WorkerThread(size=10)并讓他們運(yùn)行。每個WorkerThread線程都有個ThreadPool的引用,用于查詢ThreadPool的狀態(tài)和獲得同步鎖.WorkerThread運(yùn)行以后,循環(huán)調(diào)用ThreadPool的方法進(jìn)行查詢,如果沒有發(fā)現(xiàn)任務(wù),ThreadPool告訴正在查詢的線程進(jìn)入休眠狀態(tài),WorkerThread釋放對查詢方法的鎖定.這樣在還沒有任務(wù)的時候,所有的10個WorkerThread都會進(jìn)入休眠狀態(tài),進(jìn)入等待ThreadPool對象的等待鎖定池,只有ThreadPool對象發(fā)出notify方法(或notifyAll)后WorkerThread線程才進(jìn)入對象鎖定池準(zhǔn)備獲得對象鎖進(jìn)入運(yùn)行狀態(tài)。
          代碼片斷:
          while ( !assignments.iterator().hasNext() )
          ??? wait();
          如果你有jprofile或者其他的觀察線程的工具,你可以看到有10個線程都在休眠狀態(tài).
          ? 接著,我們向ThreadPool中加入任務(wù),這些任務(wù)都實(shí)現(xiàn)了Runnable的run方法.(至于為什么把任務(wù)都做成Runnable,譯者至今也有些疑問?預(yù)定俗成?TimerTask也是實(shí)現(xiàn)自Runnable,弄得初學(xué)者經(jīng)常把真正運(yùn)行的線程搞混).ThreadPool每assign一個任務(wù),就會發(fā)出一條消息,通知它的等待鎖定池中的線程.各個線程以搶占的方式獲得對象鎖,然后很順利的獲得一條任務(wù).并把此任務(wù)從ThreadPool里面刪除.沒有搶到的繼續(xù)等待.
          Runnable r = (Runnable)assignments.iterator().next();
          ?? assignments.remove(r);
          WorkerThread從ThreadPool那里獲得了任務(wù),繼續(xù)向下執(zhí)行。
          target = owner.getAssignment();
          ?? if (target!=null) {
          ??? target.run();?????
          ??? owner.done.workerEnd();
          ?? }
          記住,這里調(diào)用的是target.run();而不是調(diào)用的線程的start()方法。也就是說在這里表現(xiàn)出的WorkerThread和task之間的關(guān)系僅僅是簡單的方法調(diào)用的關(guān)系,并沒有額外產(chǎn)生新線程。(這就是我上面納悶為什么大家都實(shí)現(xiàn)Runnable來做task的原因)
          ?大家可能注意到,WorkerThread并沒有對異常作處理。而我們知道發(fā)生在線程上的異常會導(dǎo)致線程死亡。解決的辦法有2中,一種是通過threadpool的管理來重新激起一個線程,一種是把異常在線程之內(nèi)消滅。在項(xiàng)目中,我采用的是第二中,因此這個片斷改稱這樣:
          if (target!=null) {
          ? try{
          ??? target.run();?????
          ?? }
          ? catch(Throwable t){
          ?.......
          ?? }
          ??? owner.done.workerEnd();
          }
          在WorkerThread完成一個task以后,繼續(xù)循環(huán)作同樣的流程.
          在這個ThreadPool的實(shí)現(xiàn)里面,Jeff Heaton用了一個Done類來觀察WorkerThread的執(zhí)行情況.和ThreadPoool的等待鎖定池不同,Done的等待鎖定池里面放的是初始化ThreadPool的線程(可能是你的主線程),我們叫他母線程.
          ? 在給出的測試?yán)又?母線程在調(diào)用complete()方法后進(jìn)入休眠(在監(jiān)視中等待),一開始是waitBegin()讓他休眠,在assign加入task以后,waitDone()方法讓他休眠.在WorkerThread完成一個task以后,通知waitDone()起來重新檢查activeThreads的數(shù)值.若不為0,繼續(xù)睡覺.若為0,那么母線程走完,死亡(這個時候該做的task已經(jīng)做完了).母線程走完,ThreadPool還存在嗎?答案是存在,因?yàn)閃orkerThread還沒有消亡,他們在等待下一批任務(wù),他們有ThreadPool的引用,保證ThreadPool依然存在.大家或許已經(jīng)明白Done這個類的作用了.
          ? 細(xì)心的讀者或許會發(fā)現(xiàn),發(fā)生在Done實(shí)例上的notify()并不是像ThreadPool上的notify()那樣每次都能完成一項(xiàng)工作.比如除了第一個被assign的task,其他的task在assign進(jìn)去的時候,發(fā)出的notify()對于waitDone()來說是句"狼來了".
          ?最后在ThreadPool需要被清理得時候,使每一個WorkerThread中斷(這個時候或許所有的WorkerThread都在休眠)并銷毀.記住這里也是一個異步的過程.等到每一個WorkerThread都已經(jīng)銷毀,finalize()的方法體走完.ThreadPool被銷毀.
          ?for (int i=0;i<threads.length;i++) {
          ?? threads[i].interrupt();
          ?? done.workerBegin();
          ?? threads[i].destroy();
          ? }
          ? done.waitDone();
          為什么有句done.workerBegin();?不明白.
          參考文章:
          http://www.zdnet.com.cn/developer/common/printfriend/printfriendly.htm?AT=39276905-3800066897t-20000560c

          posted @ 2006-07-16 20:07 binge 閱讀(7188) | 評論 (1)編輯 收藏

          關(guān)于作者

          ??? 呂華兵,男,24歲。
          ??? 2000-2004年,在中國民航大學(xué)讀書。學(xué)習(xí)期間,筆者以技術(shù)部長身份參與了校易航工作室暨易航網(wǎng)站的創(chuàng)建和發(fā)展工作,參與和獨(dú)立完成了多個項(xiàng)目的設(shè)計(jì)和開發(fā)。
          ?? 2004年5月到2006年5月,在北京環(huán)亞時代(港新合資)天津軟件中心從事Java的開發(fā)工作。參與了CMCC的OA的實(shí)施工作,主力開發(fā)了MOCHA AM的前端顯示和MOCHA ITAM的報(bào)表系統(tǒng)。
          ? 2006年5月至今,在美國易達(dá)軟件有限公司工作。設(shè)計(jì)并開發(fā)了Information Publisher的多線程后端程序。
          ??
          ? 筆者長期從事j2se,j2ee的開發(fā)工作,對各種設(shè)計(jì)模式亦有豐富的使用經(jīng)驗(yàn)。
          ? 筆者從來重視規(guī)范的軟件流程,對RUP有很深的理解。
          ? 對于javascript,dhtml,ajax,筆者有著豐富的經(jīng)驗(yàn)。
          ? 筆者也是“拿來主義”的擁躉,不遺余力的翻譯、學(xué)習(xí)、使用和宣傳各種開源項(xiàng)目。目前使用過的開源項(xiàng)目有:spring、picocontainer、hibernate、ibatis、struts、webwork等框架系列,DOM系列,commons系列,Quartz,log4j,ant,oscache,proxool以及各種報(bào)表工具等等。

          ?筆者從來重視知識的提取和積累,這也是筆者開此blog的主要原因,同時,也希望通過此blog結(jié)交更多的朋友。

          posted @ 2006-07-16 10:15 binge 閱讀(416) | 評論 (0)編輯 收藏

          關(guān)于GWT的第一手經(jīng)驗(yàn)

          譯者安:你敢大膽采用最新的技術(shù)嗎?你顧慮哪些方面?下面的采訪將給我們提供一個參考。
          ?原文:
          ? ?? 在java中,對技術(shù)的采用是一件讓人心煩的事情,因?yàn)槲覀儷@得通知的途徑太多。不同的會議,不同的站點(diǎn)如slashdot和theserverside,而且還有數(shù)不清的個人博客如dhh和o'Reilly's Radar.
          一個讓人感興趣的技術(shù)總是讓業(yè)界議論紛紛,正如人們所意識到的,這個產(chǎn)品并不是成熟期。
          ??? 為了讓一個產(chǎn)品成為主流,早期的采用者必須足夠喜歡這項(xiàng)產(chǎn)品來承擔(dān)很多非常的任務(wù)以便
          讓更為膽怯的開發(fā)者相信這項(xiàng)新技術(shù)值得采用。像Hibernate和Spring Framework這樣的技術(shù)花了好幾年
          才成為一個成熟產(chǎn)品。許多產(chǎn)品,比如maven,在版本確定之前經(jīng)歷了痛苦的時期因?yàn)樗麄冊缙谌狈?br />足夠的文檔或者有不同的足夠強(qiáng)大的挑戰(zhàn)者比如ant.本人對這個過程中的盲點(diǎn)很感興趣,從議論這個產(chǎn)品的介紹到大范圍的采用往往要經(jīng)歷成月上年,而且很難指定時間表。hibernate并不是暴雨似的到來,而是通過大量用戶自我采用.一個失敗的項(xiàng)目比如ojb出來的時候也是引起轟動,但是它最終沒有承諾的那么好.在這種情況下,早期的hibernate使用者其實(shí)信心不足.
          ? 讓我們來看Google Web Toolkit (GWT)…
          GWT在這個進(jìn)程中處于什么位置?
          gwt看起來是在早期使用(early-adopter)的中期。一開始的議論聲已經(jīng)消去,現(xiàn)在陸續(xù)出現(xiàn)了許多關(guān)于gwt的文章和博客,表明了人們正在期待關(guān)于gwt的第一個helloworld的反饋報(bào)告。我的很多謹(jǐn)慎的同行都在回避他,事實(shí)上認(rèn)為它是個不好的主意。風(fēng)險阻礙了開發(fā)者對大多數(shù)新技術(shù)的評估直到他們在現(xiàn)實(shí)中看到了一個活生生的實(shí)例解決方案--就像maven被ibm使用一樣。那些有能力來嘗試風(fēng)險的開發(fā)者正在對這個框架進(jìn)行測試。他們中的某一個或許宣稱gwt不適合它的組織。另外一個同行已經(jīng)原則上接受了gwt的觀點(diǎn),但是沒有時間來在他的應(yīng)用中集成。所以,到底gwt處于什么時期?早期的使用人群有哪些經(jīng)驗(yàn)?zāi)兀?br />?? 關(guān)于這個問題,我專門采訪了Grassroots Technologies公司的Michael Podrazik。Grassroots Technologies是一個在紐約的咨詢小組。通過在Grassroots的工作,michael已經(jīng)正在把gwt應(yīng)用在他們的一個新的正在開發(fā)的web應(yīng)用當(dāng)中。在下面的采訪里面,我要求他來交流他的產(chǎn)品經(jīng)驗(yàn)來幫助其他人去理解gwt.我特別要求他給一些gwt客觀的意見,而且細(xì)致的描述他在用gwt開發(fā)過程中遇到的挑戰(zhàn)。幸運(yùn)的是,他的信息將會幫助你決定是否gwt是你項(xiàng)目的正確選擇。
          采訪內(nèi)容:
          q:什么使你選擇了gwt?
          a:我訂閱了google的blog,所以我聽說了gwt當(dāng)他發(fā)布到j(luò)avaone的時候。在閱讀了他的文檔之后我開始對這種方式很好奇,因此我把它down了下來而且開始使用它(play with it).我剛剛開始了一個項(xiàng)目,這個項(xiàng)目是把遺留的 Access/VBA的桌面應(yīng)用升級為一個web應(yīng)用。在UI方面有許多ajaxian特性所以我想我可以讓gwt一展身手。我認(rèn)為(figure)只要我保持我的架構(gòu)足夠抽象,我就有能力用更為傳統(tǒng)的web應(yīng)用框架來替換gwt層。gwt會很傷腦筋嗎?至少目前為止我很開心。
          q:gwt出現(xiàn)了那些挑戰(zhàn)?你圍繞著gwt設(shè)計(jì)的web框架嗎?gwt是否挑戰(zhàn)了你關(guān)于web應(yīng)用開發(fā)的觀點(diǎn)?
          a:你確實(shí)不能簡單的認(rèn)為gwt是一個webapp的框架,他更是一個有著rpc和對象序列化的ui類庫。因?yàn)槟阈枰淖兡沩?xiàng)目組織的assumptions以及包的結(jié)構(gòu)。在java服務(wù)端開發(fā)rich-client用戶界面我們有大量的經(jīng)驗(yàn),比如flash/actionscript.gwt和他們十分類似,因此可以想象有這些元素的項(xiàng)目--分隔的服務(wù)端和客戶端而不是同一的webapp--很爽。
          ? 朝著這個方向,你需要明確區(qū)分服務(wù)端和客戶端的功能。我相信一個好的哲學(xué)就是使你的客戶端僅僅用于展示。
          ? 你需要思考你服務(wù)接口的設(shè)計(jì),比如每個操作的粒度
          ? 你不能在客戶端代碼上用java5得語法
          Q:你的意思是不能再gwt的具體類或者普通的web應(yīng)用里面用java5的語法?
          a:你不能在客戶代碼里面使用java5的語法。我們在服務(wù)端代碼中使用了許多java5的特性,但是所有將要被轉(zhuǎn)換成javascript的代碼必須是1.4的規(guī)范。
          這個也包括許多事實(shí)上你用在服務(wù)端的類。因?yàn)閞pc框架允許用戶定義的數(shù)據(jù)類型的序列化,意思是你將在瀏覽器端得到一個已經(jīng)被轉(zhuǎn)化為javascript實(shí)例的類,這個類作為一個參數(shù)傳遞到服務(wù)端的實(shí)現(xiàn)中。在你的服務(wù)端代碼中,你將操縱同一個class而且是編譯過的字節(jié)碼。
          ?這個時候就出現(xiàn)了一個選擇,domain module和gwt的耦合度怎樣才合適呢?
          What we decided was to keep value objects implementation-agnostic so as to avoid “infecting” the API and persistence layers with beans implementing GWT’s IsSerializable interface.
          舉個例子,在服務(wù)端我們有個IUser接口的用戶模塊,這個借口繼承自IPersistable.gwt的實(shí)現(xiàn)接受和返回實(shí)現(xiàn)IsSerializable接口的GwtUser的實(shí)例并把這些實(shí)例利用commons-beanutils發(fā)送到服務(wù)端。
          ?對于這一點(diǎn)可能有些爭論,這樣做并不非必要。但是我覺得這點(diǎn)額外的工作將帶給你更為清晰的層次劃分。我們可以嵌入gwt到任何一點(diǎn),而且可以轉(zhuǎn)換到springmvc或者struct或者其他的地方,而不需要擔(dān)心代碼上?的反應(yīng)。
          q:你發(fā)現(xiàn)gwt產(chǎn)生的javascript不能垮瀏覽器的地方了嗎?你發(fā)現(xiàn)gwt產(chǎn)生的javascript包含一些錯誤需要手動調(diào)試了嗎?
          a:都沒有,這正是令我們驚訝的地方。跨瀏覽器javascript的開發(fā)是PITA,而且GWT真正的把你從他那里隔離開來。
          我發(fā)現(xiàn)了大量的在FIREFOX和IE不同的地方,但是這些最后被確認(rèn)都是CSS支持的問題而于GWT無關(guān)。
          我也遇到了一大隊(duì)JAVASCRIPT錯誤,但是這些錯誤都是應(yīng)為變量而不在初始化,這些問題很快就會找到并且不需要大量的調(diào)試。目前已經(jīng)完成的大多數(shù)工作并不全是ui控件的問題,或許隨著我們的深入,我們會遇到一些問題,但是目前為止,我們還沒有多少麻煩。
          q:你的工作組的成員是更喜歡java還是javascript呢?
          顯然是java,哈哈。但是我們有人對javascript和actionscript也很精通。就像譯者本人。
          q:一句話,對正在考慮gwt的人,你有什么建議?你會推薦他嗎?你對這項(xiàng)技術(shù)的客觀觀點(diǎn)是什么?thumbs up or thumbs down?
          a:目前是thumbs up.我們目前仍然在開發(fā)的早期,而且我還不想說在它是完美的或者在以后的進(jìn)程中不會咬我們一口。意思是說,你的建構(gòu)要搭好。 它真的像是在作swing或者其他UI的桌面應(yīng)用。
          ?我們用基于Controller和IView實(shí)現(xiàn)的GWT生成了全部的ui.除了gwt模塊引入以外,那里沒有html。
          ? 這是對幾乎所有主流web應(yīng)用范例的違背,但是如果你喜歡ui編程,他完美的抽象了ajax/dhtml的行為到一個十分友好和可擴(kuò)展的api.
          ? 我或許會說如果你的工作是php,asp或者其他語言,你或許需要花更多的功夫。如果你已經(jīng)是一個有經(jīng)驗(yàn)的java程序員,那么你可以很快投入其中。

          posted @ 2006-07-08 13:47 binge 閱讀(1172) | 評論 (0)編輯 收藏

          java.util.Date和java.sql.Date

          java.sql.Date,java.sql.Time和java.sql.Timestamp三個都是java.util.Date的子類(包裝類)。
          但是為什么java.sql.Date類型的值插入到數(shù)據(jù)庫中Date字段中會發(fā)生數(shù)據(jù)截取呢?
          java.sql.Date是為了配合SQL DATE而設(shè)置的數(shù)據(jù)類型。“規(guī)范化”的java.sql.Date只包含年月日信息,時分秒毫秒都會清零。格式類似:YYYY-MM-DD
          當(dāng)我們調(diào)用ResultSet的getDate()方法來獲得返回值時,java程序會參照"規(guī)范"的java.sql.Date來格式化數(shù)據(jù)庫中的數(shù)值。因此,如果
          數(shù)據(jù)庫中存在的非規(guī)范化部分的信息將會被劫取。在sun提供的ResultSet.java中這樣對getDate進(jìn)行注釋的:
          Retrieves the value of the designated column in the current row of this <code>ResultSet</code> object as a “java.sql.Date” object in the Java programming language.
          同理。如果我們把一個java.sql.Date值通過PrepareStatement的setDate方法存入數(shù)據(jù)庫時,java程序會對傳入的java.sql.Date規(guī)范化
          ,非規(guī)范化的部分將會被劫取。
          ?然而,我們java.sql.Date一般由java.util.Date轉(zhuǎn)換過來,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()).
          ?顯然,這樣轉(zhuǎn)換過來的java.sql.Date往往不是一個規(guī)范的java.sql.Date.
          ?在http://www.thunderguy.com/semicolon/2003/08/14/java-sql-date-is-not-a-real-date/ 文章中提到,要保存java.util.Date的精確值,
          ?我們需要利用java.sql.Timestamp.
          ?感謝這篇文章的鋪墊:http://community.csdn.net/Expert/topic/4354/4354971.xml?temp=.5256616

          posted @ 2006-07-06 16:51 binge 閱讀(4288) | 評論 (0)編輯 收藏

          log4j配置概要

          官方網(wǎng)址:
          http://logging.apache.org/log4j/docs/index.html

          一個中文翻譯的文檔:

          http://www.jaxwiki.org/zh/project/logging.apache.org/log4j/docs/manual.html


          我摘出黃色字體表明幾條列在下面,也是筆者認(rèn)為log4j最主要特點(diǎn)的濃縮:

          1.階層式的命名:

                如果一個logger 的名字后面跟著一個點(diǎn)號(dot),它就是點(diǎn)號(dot)后面的那個logger的前輩( ancestor),是這個晚輩(descendant) 的前綴。如果在它自己和這個晚輩之間沒有其它的前輩,它和這個晚輩之間就是關(guān)系。

          2.級別繼承

             對于一個給定的logger C,它繼承的級別等于logger階層里,從C開始往root logger上去的第一個non-null級別。


          3.執(zhí)行規(guī)則

             在一個級別為q(被指定的或繼承的)的logger里,一個級別為p的日志請求,只有在p >= q 時才能夠被執(zhí)行。

          4.appender添加性的規(guī)則

          Logger C的log輸出信息將被輸出到C的所有appenders和它的前輩的 appenders。這就是"appender additivity"的意思。但是,如果logger C的前輩,比如說P,P的additivity flag被設(shè)置為 false,那么,C的輸出信息將被輸出到C的所有appenders中去,以及它的前輩的——截止在P那里,包括P在內(nèi)的,appenders中去,但是不會輸出到P的前輩的 appenders中去。 默認(rèn)情況下,Loggers的additivity flag設(shè)置為true

          關(guān)于日志格式:暫貼幾個樣例:
          log4j.appender.A1.layout.ConversionPattern=%d %-5p [%t] %-c (%13F:%L) %3x - %m%n

          在配置文件中,log4j可以訪問到系統(tǒng)環(huán)境變量。具體的變量參考相關(guān)資料。
          一篇我很早以前在csdn寫的文章:
          http://blog.csdn.net/huabingl/archive/2005/02/19/293933.aspx

          posted @ 2006-07-04 10:07 binge 閱讀(533) | 評論 (0)編輯 收藏

          Mysql數(shù)據(jù)庫使用技巧

            我承認(rèn)我用mysql有很長時間了,不過似乎我仍然很白。好吧,還是寫寫吧。
            1。1067錯誤,無法啟動。7/3/2006
               解決步驟和方案:察看日至,mysql.user表莫名其妙的弄丟了。從其他地方扒下一個放在這里就可以了。
           2.非安裝版mysql的安裝和啟動。
               一般情況下,本人習(xí)慣用非安裝版的軟件。為了安裝方便,你可以把解壓后的文件拷貝到c盤根目錄下,并把總目錄改為mysql.然后進(jìn)入windows命令 控制臺,在c:/mysql/bin下面運(yùn)行mysqld-nt --install把它安裝為一個服務(wù),然后調(diào)用net start mysql啟動它,停止的命令是net stop mysql  .想要移除這個服務(wù),用命令mysqld-nt --remove
           3.訪問mysql的命令:mysql -h host -u user -p 。不過有好多好用的客戶端可以使用,比如5.0自帶的工具和SQLyog Enterprise
           4。庫表相關(guān)的命令:SHOW DATABASES;SHOW TABLES;DESCRIBE table1/desc table1;
           5.察看當(dāng)前配置:show variables;
           6.關(guān)于中文亂碼問題,到一定積累,筆者準(zhǔn)備開專題。目前簡要列下:
             在mysql的一次會話中,服務(wù)器收到客戶端發(fā)來的指令后,大致要執(zhí)行3個動作:
            1、服務(wù)器認(rèn)為收到的指令是按當(dāng)前character_set_client環(huán)境變量所指定的字符集編碼的,
            2、然后再將其轉(zhuǎn)換成character_set_connection所指定的字符集編碼
            3、分析、執(zhí)行該指令。
            4、 用character_set_results變量所指定的字符集返回服務(wù)器向客戶端傳輸?shù)臄?shù)據(jù)
           解決這個問題的關(guān)鍵點(diǎn)在于設(shè)置 default-character-set 變量。
          7,在創(chuàng)建數(shù)據(jù)庫的時候,我們有時會需要提供一些編碼上的參數(shù),如:
          #1. Create mvnforum database with the "Create database" syntax (for unicode and others):
          #   mysql> CREATE DATABASE mvnforum CHARACTER SET [charater_set] COLLATE [collation]
          #  mysql> CREATE DATABASE mvnforum CHARACTER SET utf8 collate
          #   Where charater_set and collation : @see http://dev.mysql.com/doc/refman/4.1/en/charset-mysql.html
          #
          #   a, practice to view all supported character set
          #      mysql> SHOW CHARACTER SET;
          #   b, practice to view all supported collation:
          #      mysql> SHOW COLLATION;
          #
          #   c, Example for Unicode:
          #      mysql> CREATE DATABASE mvnforum CHARACTER SET utf8 COLLATE utf8_general_ci
          #"
          "
             未完待續(xù)。
            歡迎回帖。

          posted @ 2006-07-03 23:16 binge 閱讀(1446) | 評論 (2)編輯 收藏

          關(guān)于異常Exception

          1。什么是異常
          ???異常是一種狀態(tài),是程序出現(xiàn)了符合該異常條件的一種狀態(tài)。因此,他也可以說成是一種條件。
          2。為什么要捕獲異常
          ? 捕獲異常是為了對程序中出現(xiàn)的某種狀況進(jìn)行處理。如果有異常而沒有捕獲,異常將會向上一層傳播,最終導(dǎo)致線程在此中止。
          3。什么是check異常和unchecked異常
          ? uncheck異常一般是RuntimeException.出現(xiàn)這類異常,編譯器不會強(qiáng)制要用戶去捕獲(當(dāng)然你可以捕獲)。?? 編譯器會強(qiáng)制要求用戶對checked異常進(jìn)行捕獲并作出一定的處理。
          4。為什么不推薦捕獲頂層異常(Exception)
          ? 程序中會發(fā)生各種各樣的異常。除非你的程序是個終端(一個業(yè)務(wù)的終點(diǎn)),否則不推薦捕獲頂層異常。
          ?在程序的中間環(huán)節(jié)捕獲所有異常毫無意義,并有可能導(dǎo)致流程上的隱患。比如,出現(xiàn)某種異常后,期望線程就此結(jié)束,不去做下面的工作,但是如果在中間環(huán)節(jié)對頂層異常進(jìn)行了非法處理,程序有可能會運(yùn)行下去,將導(dǎo)致不可控的錯誤。
          5。為什么要自定義異常
          ?自定義異常是為了設(shè)置異常鏈的起點(diǎn)。一般情況下,我們都是允許每個程序員看到所有的異常信息,這個時候大多數(shù)都是把下一層的異常直接重?cái)S到上一層。然而在多層次的結(jié)構(gòu)中,我們有時候需要隱藏底層異常(這種異常的信息很多,很枯燥),而給消費(fèi)者提供一個更為直觀的異常,這個時候我們需要自定義異常。有的異常類jdk已經(jīng)給我們提供,比如常用的IllegalArgumentException。如果你想在此再作包裝,你可以創(chuàng)建自己的異常類。如此,消費(fèi)者將以此異常作為異常鏈的起點(diǎn)。
          6。為什么要重?cái)S異常
          ?重?cái)S異常是處理異常的一種方式。在捕獲了某種異常后,用戶可能不希望在這一層做出裁決,或者即使做出了一定的處理,但仍然需要向上一層報(bào)告,因此需要重?cái)S異常。
          7。異常機(jī)制。
          ?? 一旦某個點(diǎn)發(fā)生異常,這個點(diǎn)下面和catch語句之間的代碼將不會被執(zhí)行。因此,異常是一種中止流程的很有效的機(jī)制。
          ?? 關(guān)于異常,在effective java中提到“異常轉(zhuǎn)譯”和“異常連接”的概念。本人傾向于用“異常轉(zhuǎn)譯”,前提是要配置log4j,并作詳細(xì)的日志紀(jì)錄。

          posted @ 2006-06-29 11:40 binge 閱讀(1407) | 評論 (1)編輯 收藏

          XMLBeans

          ?XmlBeans由 BEA公司發(fā)明,后捐贈給Apache基金會的。
          ?在項(xiàng)目中遇到這樣的需求,根據(jù)已有的schema對xml進(jìn)行格式校驗(yàn),并讀取出xml得數(shù)據(jù)。
          ?在大搜一番后,我最終把目光停留在xmlbeans上面。被淘汰的是digester.
          ?下面是一篇dev2dev得文章:
          ??http://dev2dev.bea.com/pub/a/2006/05/xmlbeans-2.html?page=4
          ?我就不炒飯了。
          ?好心的人給簡單翻譯了一下:
          http://dev2dev.bea.com.cn/techdoc/200403127.html
          ?翻譯得內(nèi)容很少,有空本人補(bǔ)上。
          ibm dw上也有個豆腐塊:
          http://www-128.ibm.com/developerworks/cn/xml/x-beans1/
          關(guān)于digester的內(nèi)容,只選了一篇文章:來自devx得
          http://www.devx.com/Java/Article/21832/1763

          關(guān)于2中方法的對比,他們的文章已經(jīng)說的很詳細(xì)了。

          xmlbeans采用的是sax來讀取數(shù)據(jù)。2004年,由bea公司發(fā)明的stax(stream API for XML)已經(jīng)被jcp列為標(biāo)準(zhǔn)jsr-173,在jdk6.0中會出現(xiàn)。
          ?
          關(guān)于stax,sax和dom的對比超出本篇范圍,在此略過。
          后記:
          ? 在正在完成的項(xiàng)目中,我采用了xmlbeans,它的引入給我?guī)砹撕艽蟮姆奖?

          posted @ 2006-06-21 13:50 binge 閱讀(632) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共4頁: 上一頁 1 2 3 4 下一頁 
          主站蜘蛛池模板: 资阳市| 上栗县| 朝阳县| 邓州市| 平定县| 文昌市| 美姑县| 共和县| 巴彦淖尔市| 政和县| 修文县| 柳州市| 册亨县| 措勤县| 丘北县| 同心县| 井研县| 东安县| 响水县| 芮城县| 纳雍县| 额尔古纳市| 筠连县| 道真| 普安县| 文成县| 盈江县| 青铜峡市| 福安市| 炎陵县| 响水县| 塔城市| 白城市| 永安市| 通江县| 琼海市| 灌云县| 高州市| 普格县| 虹口区| 岫岩|