<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    That way I want to stay

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      55 Posts :: 1 Stories :: 41 Comments :: 0 Trackbacks

    置頂隨筆 #

    或者點(diǎn)這個(gè)鏈接:

    http://m.tkk7.com/Wingel/category/17919.html

    posted @ 2006-12-01 09:22 Wingel 閱讀(402) | 評(píng)論 (2)編輯 收藏

    2009年7月31日 #

    這是我的個(gè)人主頁,有興趣的同學(xué)大家互相關(guān)注一下:
    http://www.tuijianba.com/9889.html
    posted @ 2009-07-31 23:14 Wingel 閱讀(145) | 評(píng)論 (0)編輯 收藏

    2007年1月26日 #

    最近一直在開發(fā)一款I(lǐng)DE,本來設(shè)計(jì)的目標(biāo)只是一個(gè)單機(jī)版的客戶端,不會(huì)連接任何服務(wù)端。后來用戶突然加了一項(xiàng)需求,想要訪問數(shù)據(jù)庫(kù),去查詢一些數(shù)據(jù)。 其實(shí)這本來也不是什么怪異的需求,只是一種C/S系統(tǒng)而已。那時(shí)候剛聽到這個(gè)需求的時(shí)候,馬上想到的是,用hibernate, ibatis還是直接用JDBC。不如用ibatis吧,只需要查詢幾個(gè)表的幾個(gè)字段而已,這一項(xiàng)剛好足夠。 可是要增加數(shù)據(jù)庫(kù)的支持時(shí),心里特別的別扭,這款I(lǐng)DE的目標(biāo)客戶是遍布各個(gè)地方的,這一點(diǎn)就決定了,我們不可能用C/S的方法。 后來是在online system上加了一個(gè)web service,讓這個(gè)IDE去調(diào)用。這樣任何地方都可以訪問這個(gè)服務(wù)了。 就算不論這一點(diǎn),在考慮要用客戶端直接連數(shù)據(jù)庫(kù)的時(shí)候,心里面就像吃了螞蟻似的,非常不爽。不知道是因?yàn)锽/S系統(tǒng)做多了,還是因?yàn)橛X得客戶端直接連數(shù)據(jù)庫(kù)本身就是一種不對(duì)的做法,總之現(xiàn)在已經(jīng)有點(diǎn)不喜歡C/S結(jié)構(gòu)的系統(tǒng)了,或者說,不喜歡客戶端/數(shù)據(jù)庫(kù)服務(wù)這樣的系統(tǒng)。 不知道諸位程序員同
    文章來源:http://blog.csdn.net/Wingel/archive/2007/01/25/1493585.aspx
    posted @ 2007-01-26 05:17 Wingel 閱讀(260) | 評(píng)論 (1)編輯 收藏

    2007年1月23日 #

    ?程序員有個(gè)偏好,那就是實(shí)現(xiàn),他們喜歡把東西實(shí)現(xiàn)出來。這是一個(gè)優(yōu)點(diǎn),實(shí)現(xiàn)能力越強(qiáng)的人,一般編程能力也越強(qiáng),我們也就可以說,他的技術(shù)越強(qiáng)。
      但是喜歡實(shí)現(xiàn)卻又是程序員的缺點(diǎn),因?yàn)樗麄冊(cè)趯?shí)現(xiàn)一樣?xùn)|西的時(shí)候,經(jīng)常會(huì)不想去理會(huì)其他的事情。比如說,程序員接到一項(xiàng)任務(wù)時(shí),普通的程序員就馬上會(huì)開始動(dòng)手。稍微好一些的程序員則會(huì)仔細(xì)思考一下再動(dòng)手。可惜,這樣子也是程序員管理能力欠缺的一個(gè)原因。
      當(dāng)你的能力足夠的時(shí)候,你應(yīng)該懂得,把分配給你的任務(wù)計(jì)劃一下,看看多久完成,如果你要把這個(gè)任務(wù)分塊的話,嘗試估計(jì)一下各個(gè)塊的完成時(shí)間。不要因?yàn)閾?dān)心預(yù)計(jì)得不準(zhǔn),就不去估計(jì)。因?yàn)橛袀€(gè)計(jì)劃給領(lǐng)導(dǎo),絕對(duì)比沒有的強(qiáng)。
      開發(fā)經(jīng)驗(yàn)逐漸增多的情況下,你已經(jīng)有能力相對(duì)準(zhǔn)確的計(jì)劃自己的任務(wù)了。這時(shí)候你應(yīng)該去找你的領(lǐng)導(dǎo),把他今年可能會(huì)分配給你的任務(wù)看一下。這件事情很重要,因?yàn)槟悴蛔龅脑挘氵€只是一個(gè)程序員。因?yàn)槟銓?duì)自己的能力已經(jīng)有了充分的認(rèn)識(shí),也能相對(duì)準(zhǔn)確的估計(jì)你的開發(fā)進(jìn)度了。你可以好好把今年的任務(wù)計(jì)劃一下,把更新好的進(jìn)度表給你的領(lǐng)導(dǎo)。因?yàn)樗麑?duì)你開發(fā)進(jìn)度的估計(jì),怎么樣都沒有你自己估計(jì)的準(zhǔn)確。你能給一份計(jì)劃,他會(huì)很開心。
      現(xiàn)在,你已經(jīng)有能力計(jì)劃自己整年的開發(fā)情況了。
      但是計(jì)劃會(huì)改變。  
      我們要擁抱計(jì)劃的變更!
      你跟客戶,或者負(fù)責(zé)需求的人熟嗎?只有時(shí)刻掌握著需求的變化,才能時(shí)刻把握好自己的計(jì)劃。
      你跟QA熟嗎?QA對(duì)你這個(gè)人開發(fā)質(zhì)量的印象如何?清楚自己的開發(fā)質(zhì)量,才能保證把事情做好的能力一直在進(jìn)步。
      你跟領(lǐng)導(dǎo)熟嗎?你保證你做的事情領(lǐng)導(dǎo)都知道嗎?你想做什么領(lǐng)導(dǎo)也知道?
      你敢不敢說,所有跟你有關(guān)的情況,都盡在你的掌握?
      會(huì)不會(huì)覺得這些很像空話,很不實(shí)際!
      但是有做總是有好處的!
      你做得越多,你越過程序員就越快。因?yàn)槟悴荒埽膊幌胫皇菃尉€程的程序員!
    posted @ 2007-01-23 17:49 Wingel 閱讀(1175) | 評(píng)論 (2)編輯 收藏

    2007年1月21日 #

    ???? 前了陣子,做了個(gè)firefox下的插件,在了解它的插件運(yùn)作的過程中,才發(fā)現(xiàn),原來程序還可以是這樣組成的。
    ??? 我們現(xiàn)在的所有B/S程序,UI上就是由HTML+JavaScript組成的,而它這樣的局限就是,這樣的UI只能在瀏覽器上運(yùn)行;而且它的UI會(huì)比較簡(jiǎn)單,不能像桌面程序中的一些效果。
    ??? 前面那個(gè)問題,其實(shí)很容易回答,大部分桌面程序也只能在Window上運(yùn)行,大部分人都會(huì)裝Windows,但是大部分人也都會(huì)裝瀏覽器。
    ??? 而后面這個(gè)問題,就是我要說的內(nèi)容了。Firefox里面所有界面上的布局,都是用類似于HTML的XUL語言生成的,它比HTML支持更多的UI,更方便的一些操作。
    ??? 當(dāng)你發(fā)現(xiàn),用HTML就可以構(gòu)造出一個(gè)功能非常復(fù)雜的GUI時(shí),當(dāng)你發(fā)現(xiàn)光光html就可以做出一個(gè)Firefox那樣的界面時(shí),當(dāng)你發(fā)現(xiàn),F(xiàn)irefox這個(gè)平臺(tái)上所有的程序都是由HTML組成時(shí),這就是我的驚異了。
    ??? 當(dāng)你發(fā)現(xiàn),其實(shí)用HTML就可以做出所有的GUI程序時(shí),這就是Moliza的思路了(其實(shí)NetBean的RPC中各個(gè)Plugin的UI的思路跟這個(gè)有點(diǎn)類似)。
    ??? 當(dāng)你發(fā)現(xiàn),你要打開一個(gè)程序,你只需要一個(gè)瀏覽器,打開一個(gè)網(wǎng)頁,其余啥都不用做時(shí),這就是Google的思路了。
    ??? 這就是我的感覺。
    ??? 而且我在做這個(gè)Firefox的插件時(shí),我一直感覺我在用AJAX,其實(shí)AJAX的思路,最有價(jià)值的就是,UI上每次變更,不需要刷新整個(gè)頁面,不需要 Reload整個(gè)UI,只需要變更它需要變化的部分,就像桌面程序一樣。而你在用Firefox的時(shí)候,你會(huì)感覺到Firefox在刷新什么東西嗎?
    posted @ 2007-01-21 13:07 Wingel 閱讀(2787) | 評(píng)論 (8)編輯 收藏

    2006年12月16日 #

    敏捷開發(fā)的必要技巧完整版.rar ?或者 下載
    posted @ 2006-12-16 09:50 Wingel 閱讀(1668) | 評(píng)論 (12)編輯 收藏

    2006年12月14日 #

    鏈接: 第14章結(jié)對(duì)編程.rar ? 或者 下載

    結(jié)對(duì)編程的好處:

    聯(lián)合兩人的知識(shí)去對(duì)付一個(gè)難題。

    知識(shí)互相傳遞。

    更有效的查錯(cuò)跟糾錯(cuò)。

    程序員都很開心。

    減少員工離職的損失。

    ?

    結(jié)對(duì)編程需要的一些技能:

    用代碼解釋已有的設(shè)計(jì)結(jié)構(gòu)。

    用例子來解釋。

    用圖表來解釋設(shè)計(jì)思路。

    如果你無法把你的設(shè)計(jì)思路表達(dá)清楚,把代碼寫出來。

    讓比較迷惑的搭檔來寫代碼,這樣他就可以較好的融入你的概念。

    經(jīng)常的休息。

    經(jīng)常的更換搭檔。

    具體內(nèi)容請(qǐng)下載pdf觀看。
    posted @ 2006-12-14 21:25 Wingel 閱讀(1074) | 評(píng)論 (0)編輯 收藏

    2006年12月11日 #

    下載地址: 第13章測(cè)試驅(qū)動(dòng)編程.rar? 或者? 下載

    TDD及它的優(yōu)點(diǎn)

    ?

    ??? 上面這種編程的方式,就叫“測(cè)試驅(qū)動(dòng)編程Test Driven Development (TDD)”,因?yàn)槲覀兛偸窃趯懻嬲a之前寫一個(gè)通不過的測(cè)試,然后再寫真正的代碼,讓測(cè)試通過。

    ??? 跟測(cè)試后行的開發(fā)方式相比,它有如下好處:

    ??????????????????????????????????????????????????????

    ??? 1.為了更容易的寫單元測(cè)試,我們會(huì)廣泛的使用接口(比如StudentRegistryChecker等)。這個(gè)會(huì)讓單元測(cè)試代碼很容易讀跟寫,因?yàn)闇y(cè)試代碼里面沒有多余的數(shù)據(jù)。如果我們不用TDD而是直接寫實(shí)現(xiàn)的話,我們經(jīng)常會(huì)使用現(xiàn)成的類(比如StudentSet),測(cè)試為了調(diào)用現(xiàn)成的類,就不得不創(chuàng)建很多多余的數(shù)據(jù),創(chuàng)建很巨型的對(duì)象,就像Student或者Course

    ???

    ??? 2.因?yàn)閺V泛的使用接口,我們的類之間就不會(huì)藕合(比如EnrollmentSet就一點(diǎn)都不知道StudentSet的存在),因此重用性更好。

    ?

    ??? 3.寫單元測(cè)試的時(shí)候,很容易就可以為一個(gè)行為寫一個(gè)測(cè)試用例,讓它通過,然后為另一種行為寫另一個(gè)測(cè)試用例。也就是說,整個(gè)任務(wù)會(huì)被劃分成很多小的任務(wù),獨(dú)立完成。如果我們不用TDD而直接實(shí)現(xiàn)的話,我們很容易就會(huì)同時(shí)把所有的行為都實(shí)現(xiàn)了。這樣花的時(shí)間長(zhǎng),而且在這相當(dāng)長(zhǎng)的時(shí)間里面,寫的代碼都是沒有測(cè)試過,不能保證準(zhǔn)確性的。相反的,用TDD的話,我們只實(shí)現(xiàn)要測(cè)的行為的代碼。它只花費(fèi)很少的時(shí)間(幾分鐘),而且可以馬上測(cè)試。

    posted @ 2006-12-11 16:50 Wingel 閱讀(1131) | 評(píng)論 (0)編輯 收藏

    2006年12月9日 #

    第12章單元測(cè)試.rar ?或者 下載 ? 下載pdf。

    ???
    單元測(cè)試跟驗(yàn)收測(cè)試有什么區(qū)別?驗(yàn)收測(cè)試測(cè)試的是系統(tǒng)的外部行為,而單元測(cè)試是測(cè)試系統(tǒng)內(nèi)部結(jié)構(gòu),它只測(cè)一個(gè)單元(類,甚至一個(gè)方法)。驗(yàn)收測(cè)試屬于客戶的,我們沒有權(quán)利決定驗(yàn)收測(cè)試的內(nèi)容。我們頂多只是幫忙客戶根據(jù)用戶例事寫出驗(yàn)收測(cè)試。單元測(cè)試屬于我們,因?yàn)橄到y(tǒng)里面有什么類,每個(gè)類都做什么,是由我們決定的。客戶就沒有權(quán)利涉及了,而且我們也不需要他的參與。我們只是根據(jù)我們對(duì)這個(gè)單元(類)的期望寫出單元測(cè)試。因此,這種測(cè)試又叫“程序員測(cè)試”。

    posted @ 2006-12-09 10:01 Wingel 閱讀(1017) | 評(píng)論 (0)編輯 收藏

    2006年12月8日 #

         摘要: 之前講了怎么對(duì)代碼進(jìn)行驗(yàn)收測(cè)試,但如果代碼跟UI相關(guān)的話,驗(yàn)收測(cè)試又要怎么寫?  閱讀全文
    posted @ 2006-12-08 21:21 Wingel 閱讀(1067) | 評(píng)論 (0)編輯 收藏

    2006年12月7日 #

         摘要: 當(dāng)你實(shí)現(xiàn)了一個(gè)用戶例事(user story),你怎么判斷你的代碼是真正的,是用戶真正想要的?  閱讀全文
    posted @ 2006-12-07 11:17 Wingel 閱讀(1387) | 評(píng)論 (0)編輯 收藏

    2006年12月5日 #

    pdf下載地址: 第9章用CRC卡協(xié)助設(shè)計(jì).rar
    或者: 下載

    摘錄一些東西,具體請(qǐng)下附件觀看:

    因?yàn)樵谶@些卡里面,我們寫上了類名,它的職責(zé),以及它的協(xié)作關(guān)系,我們管這樣的卡片叫“CRC卡”。CRC就是ClassResponsibilityCollaboration的簡(jiǎn)稱。

    CRC 卡的典型應(yīng)用 

    為什么用CRC卡,而不用文檔或者更先進(jìn)的UML工具?

    1. 卡片上面的空間很小,這樣就可以防止我們給這個(gè)類太多的職責(zé)。如果一個(gè)類的職責(zé)太多的話(比如,超過4個(gè)),嘗試以更抽象的方式去考慮一下,將職責(zé)劃分。

    2.CRC 卡主要是用在探索或者討論類的設(shè)計(jì)的階段。如果我們覺得這個(gè)設(shè)計(jì)不行的話,我們既不用修改文檔,也不用修改類圖,只要把卡片丟了就行了。此外,一旦設(shè)計(jì)完成,我們就可以把所有的卡丟了。它們不是用來做文檔的。

    ?? 3. 如果我們覺得現(xiàn)在的卡片不合適,之前設(shè)計(jì)的比較好,我們只要簡(jiǎn)單的把之前的卡片拿出來組合就行了。

    posted @ 2006-12-05 10:51 Wingel 閱讀(1231) | 評(píng)論 (0)編輯 收藏

    2006年12月4日 #

    8 以用戶例事管理項(xiàng)目

    ?????????????????????????????????????????????????

    什么是用戶例事 (user story)

    ?

    假定這個(gè)項(xiàng)目的客戶是個(gè)飲料自動(dòng)售貨機(jī)的制造商。他們要求我們?yōu)樗麄兊氖圬洐C(jī)開發(fā)一款軟件。我們可以找他們的市場(chǎng)經(jīng)理了解這個(gè)軟件的需求。

    因此,我們的客戶就是他們的市場(chǎng)經(jīng)理。談需求的時(shí)候,有一回他這樣說:“用戶往售貨機(jī)每塞一個(gè)硬幣,售貨機(jī)都要顯示當(dāng)前該客戶已經(jīng)投了多少錢。當(dāng)用戶投的錢夠買某一款飲料時(shí),代表這款飲料的按鈕的燈就會(huì)亮。如果那個(gè)用戶按了這個(gè)按鈕,售貨機(jī)就放一罐飲料到出口,然后找零錢給他。”

    上面的話描述的是一件事情,一件用戶通過系統(tǒng)完成他一個(gè)有價(jià)值的目標(biāo)(買一罐飲料)的事。這樣的過程就叫“用戶案例 (user case) ”或者“用戶例事 (user story) ”。也就是說,上面我們的客戶所說的話,就是在描述一個(gè)用戶例事( user story )。

    ( 我解釋一下為什么用例事這個(gè)詞,沒興趣也可以忽略。在一個(gè)系統(tǒng)面前,每個(gè)用戶要完成同樣的目標(biāo),都要做這個(gè)系統(tǒng)設(shè)定的例行的事,這件事情不是一個(gè)例子,所以不叫事例,這也不是故事,也不能算一段歷程,而是一個(gè)例行的事。 )

     pdf下載地址: 第8章以用戶例事管理項(xiàng)目.rar

    posted @ 2006-12-04 11:28 Wingel 閱讀(1492) | 評(píng)論 (0)編輯 收藏

    2006年12月1日 #

    具體pdf的下載地址:
    分離數(shù)據(jù)庫(kù)訪問,UI和域邏輯

    http://wingel.javaeye.com/topics/download/ce15b67a-1df7-4a75-8f03-1a505aca35d8

    請(qǐng)從鏈接中下載,下面的內(nèi)容只是摘要。

    處理三種類別的代碼都混在了一起:

    ?? 1.UI: JDialog, JTextField, 響應(yīng)用戶事件的代碼。

    ?? 2.數(shù)據(jù)庫(kù)訪問: Connection, PreparedStatement, SQL statements, ResultSet 等等。

    ?? 3.域邏輯: 參會(huì)者的默認(rèn)id,參會(huì)者的名字必填,所屬地區(qū)的限制等等。域邏輯又稱為“域模型”或者“業(yè)務(wù)邏輯”。

    這三個(gè)不同類別的代碼混在一起,會(huì)造成下面的問題:
    1.代碼很復(fù)雜。
    2.代碼很難重用。如果我們想創(chuàng)建一個(gè)EditParticipantDialog,讓用戶更改參會(huì)者的信息,我們就想重用部分域邏輯(比如,地區(qū)的限制)。但實(shí)現(xiàn)這部分域邏輯的代碼跟AddParticipantDialog混在了一起,根本不能重用。如果是在一個(gè)web系統(tǒng)中,就更難重用了。
    3.代碼很難測(cè)試。每次要測(cè)這樣的一段代碼,我們都要建一個(gè)數(shù)據(jù)庫(kù),還要通過一個(gè)用戶操作界面來測(cè)試。
    ???? 4.如果數(shù)據(jù)庫(kù)表結(jié)構(gòu)更改了,AddParticipantDialog這個(gè)類,還有其他的很多地方都要跟著更改。
    5.它導(dǎo)致我們一直在考慮一些低層的太細(xì)節(jié)的概念,比如數(shù)據(jù)庫(kù)字段,表的記錄之類的,而不是類,對(duì)象,方法和屬性這一類的概念。或者說白了一點(diǎn),一直在考慮怎么往數(shù)據(jù)庫(kù)里面裝數(shù)據(jù),而沒有了面向?qū)ο蟮母拍睿瑳]有了建立業(yè)務(wù)模型的思維。

    因此,我們應(yīng)該將這三種類別的代碼分離開(UI,數(shù)據(jù)庫(kù)訪問,域邏輯)。????????

    posted @ 2006-12-01 16:16 Wingel 閱讀(1127) | 評(píng)論 (0)編輯 收藏

    下載:
    http://m.tkk7.com/Files/Wingel/第6章處理不合適的引用.rar
    or
    http://wingel.javaeye.com/topics/download/afd36f87-a11b-4d18-a01b-a843092ec1bc

      如果現(xiàn)在有一個(gè)類Parent,里面有個(gè)屬性的類型是Child,add的方法里面還有個(gè)參數(shù)的類型是Girl:
      class Parent{
    ??????? Child child;
    ?void add(Girl girl){
    ??? ...
    ?}
    ???? }
    ???? 因?yàn)樯厦鍼arent里面用到了Child跟Girl這兩個(gè)類,我們就說,Parent引用了類Child跟類Girl。現(xiàn)在的問題是,如果Child這個(gè)類或者Girl這個(gè)類編譯不過的話,那么Parent這個(gè)類也編譯不了了。也就是說,Parent依賴于Child跟Girl。這章講述的,就是因?yàn)橐恍╊惖囊蕾囋斐傻臒o法重用的問題。

    具體的內(nèi)容在上面的下載鏈接里面的pdf文件里,內(nèi)容較多。

    posted @ 2006-12-01 09:28 Wingel 閱讀(991) | 評(píng)論 (0)編輯 收藏

    或者點(diǎn)這個(gè)鏈接:

    http://m.tkk7.com/Wingel/category/17919.html

    posted @ 2006-12-01 09:22 Wingel 閱讀(402) | 評(píng)論 (2)編輯 收藏

    2006年11月29日 #

         摘要: 當(dāng)我們要繼承一個(gè)父類時(shí),我們要保證父類里面所有了public方法都是子類想要的,它不應(yīng)該去繼承一些它不用的功能。  閱讀全文
    posted @ 2006-11-29 20:40 Wingel 閱讀(1216) | 評(píng)論 (3)編輯 收藏

    想搭建一個(gè)框架是使用AJAX的,首先考慮到的就是Google web toolkit,看了一下它的文檔,就是將所有的dom元素封裝成Java對(duì)象了,寫起代碼來,因?yàn)橛蠭DE的幫助,而且憑著靜態(tài)語法的特點(diǎn),出錯(cuò)的機(jī)率就小了。但是有這樣一個(gè)問題,比如說想給頁面上隨便增加一點(diǎn)東西的話,卻不能隨便編輯html文件,因?yàn)镚WT生成的代碼并不是那么好讀,也就是說,每次要修改一下頁面,就要重新再編譯一下Java代碼。這點(diǎn)可不好。后來就改用YUI了,YUI的example 倒是非常的豐富,但用了總感覺不舒服,后面想想,才明白是因?yàn)樗腶pi設(shè)計(jì)得不好調(diào)用,代碼不能寫得很簡(jiǎn)潔。沒得說,又去試了一下dojo了,感覺是簡(jiǎn)潔得多了,api用了感覺挺舒服的。寫頁面的時(shí)候,想用一下prototype的$,之前還以為dojo是基于prototype寫成的,結(jié)果試了半天,才發(fā)現(xiàn)并不是這樣,正巧又在網(wǎng)上看了一篇介紹jQuery的,試了一下,就迷上它了,然后就把dojo從項(xiàng)目中移走了。
      仔細(xì)回想了這四個(gè)框架,想想自己為什么會(huì)選中jQuery。才發(fā)現(xiàn),因?yàn)閖Query的源代碼是最簡(jiǎn)潔的,結(jié)構(gòu)上也是最容易全部掌握了,寫JavaScript代碼的時(shí)候,總是希望所有的代碼都是在自己的手里面控制的,這種想法,跟一年前的想法一模一樣,當(dāng)時(shí)AJAX剛火的時(shí)候,也想去試一些開源的框架,但用了一段時(shí)間以后,就放棄了,全部使用了自己設(shè)計(jì)的框架,因?yàn)榭蚣苷莆赵谧约菏掷锩妫嫣埂?br />  JavaScript庫(kù)豐富固然好,但是越豐富,自己就越不了解全部層次,內(nèi)心就越不安。不懂這是不是大多數(shù)人的通病。可是仔細(xì)想想,為什么Java的開源庫(kù)用得這么自在,為什么JavaScript的就自在不起來呢。 
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414843.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(758) | 評(píng)論 (0)編輯 收藏

    目前jQuery網(wǎng)站上已經(jīng)有了From的驗(yàn)證框架,F(xiàn)romValidation,但是一直覺得它的框架并不好用,因?yàn)橹貜?fù)寫的東西太多了。
    于是就再次寫了自己的JavaScript驗(yàn)證框架,完全廢棄掉以前的。
    在新的框架下,是以這樣子的用法設(shè)計(jì)的:
    首先,要包括自己的js文件(這點(diǎn)不必說),而且在包括自己寫,要先包括jQuery的,如下

    <link rel="stylesheet" type="text/css" href="<ww:url value="/layout/css/style.css"/>">
    <link rel="stylesheet" type="text/css" href="<ww:url value="/layout/css/thickbox.css"/>" media="screen">
    <script type="text/javascript" src="<ww:url value="/layout/js/jquery-latest.js"/>"></script>
    <script type="text/javascript" src="<ww:url value="/layout/js/thickbox.js"/>"></script>
    <script type="text/javascript" src="<ww:url value="/layout/js/wingel.js"/>"></script>
    <decorator:head/>


    然后在要驗(yàn)證的Form里面加個(gè)屬性validatable=true,如下:

    <form id="registerForm" action="user-register.action" validatable="true">

    注意,這邊不要加onsubmit方法

    接下來,就好了,比如說有個(gè)輸入框:
    <ww:textfield name="name" id="name"/>
    我想驗(yàn)證,讓它必填,如下就可以了:
    <label for="name" validate="required">請(qǐng)?zhí)顚懨Q</label>  其中 for屬性里面填的要是驗(yàn)證的輸入框id,validate填的是驗(yàn)證方法,;label里面的文本就是驗(yàn)證不過的時(shí)候要顯示的信息。
    如果我想驗(yàn)證一個(gè)輸入框的輸入值長(zhǎng)度怎么辦,這樣子就行了

    <label for="password" validate="lengthRange:6;20">

    后面的參數(shù)用;號(hào)隔開,驗(yàn)證的方法名跟參數(shù)用: 隔開。
    wingel.js里面已經(jīng)包括了一些常用的驗(yàn)證方法,現(xiàn)在問題來了,如果要自定義驗(yàn)證方法怎么辦,如下辦:
    比如你想加個(gè)驗(yàn)證方法是hello
    則label里面的validate屬性寫成hello,
    然后加一個(gè)JavaScript方法:

    <script type="text/javascript">
        wingel.validator.rules.hello
    = function(value, element, parameters,utility) {
                 ...    }

    </script>


    里面三個(gè)參數(shù),shit , couldn't input Chinese. now English will be used.

    The first parameter is the value of the input element you want to validate,the second one is the validated element, the third one, is the parameters you add in validate label, the last one, is a utility class, you can invoke its method to make your code easier.






     
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414856.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(259) | 評(píng)論 (0)編輯 收藏

    HTML解析:Use javax.swing.text.html package, especially HTMLEditorKit.ParserCallback class.

    菜單生成:struts-menu,還有自己做的JavaScript控件.

    統(tǒng)計(jì)圖:jfreechart

    MVC框架:Mytapestry(每次改個(gè)界面都要重啟服務(wù)器),Webwork,Struts

    持久層:hibernate,ibats

    XML解析:dom4j比較易用,至少代碼可以比較簡(jiǎn)潔,但是如果要在里面?zhèn)鬏敹M(jìn)制文件的話,就比較麻煩了.網(wǎng)上有兩種方案,一種是將二進(jìn)制流用BASE64編碼成字符串,或者在MINI頭里面?zhèn)鬟f,后者這方式我還不懂要怎么弄,前者那樣的話,除了用Base64以外,直接用十六進(jìn)制轉(zhuǎn)字符串會(huì)更快,不過安全嘛~

    日記功能:log4j,其實(shí)Java關(guān)于日記功能的好像就有4種包,但是好像這個(gè)比較好用.另外建議直接用Logger.getLogger()生成log類.

    ajax:dwr可以利用JavaScript訪問Java類,它會(huì)自己將Java方法返回的類序列化,轉(zhuǎn)換成JavaScript變量;dojo則是有很多特效

    Web service:axis 的Web service不錯(cuò),不過如果排除那些規(guī)范的話,自己做一個(gè)輕量的會(huì)更實(shí)在

    工作流:目前尚沒有了解哪項(xiàng)開源的,但是一直想了解

    XML封裝:SOAP就是XML的一種協(xié)議,而且利用J2EE提供的api,可以很方便的操作附件,再者,至少規(guī)范的Web service就是用SOAP傳遞消息的.

    想要用模板的話:Velocity,至于不明白什么時(shí)候用到這種情況的話,可以參考一下www.blogcn.com中的模板更改就知道了

    全文搜索:lucene,它會(huì)把關(guān)鍵字索引存在文件中,而不是數(shù)據(jù)庫(kù),不過想想數(shù)據(jù)庫(kù)不也是把數(shù)據(jù)存在文件中的,lucene的速度比較快,而且易用.剛開始也不明白為什么lucene會(huì)那么快,后面了解到是個(gè)博士做的這個(gè)開源包,呵呵,看來人家是有很精深的算法.

    hibernate的session管理:利用線程ID的幫助來管理該線程的Session,好像大家現(xiàn)在也都是這樣子的.

    事務(wù)管理:spring有一項(xiàng)好處就是這個(gè)了.而且聽說它的JTA管理也很不錯(cuò)

    業(yè)務(wù)層和DAO層的bean管理:spring很好用,不過就是每個(gè)Bean都要寫在配置文件中(當(dāng)然,有人喜歡,有人不喜歡),如果不想寫配置文件中的話,就自己寫工廠管理Bean吧,我相信會(huì)比spring快一點(diǎn),但是spring寫在配置中這樣有點(diǎn)好處就是,如果你想把某個(gè)接口的實(shí)現(xiàn)類換掉的話,改一下配置文件就可以了.

    動(dòng)態(tài)bean管理:JMX,其實(shí)自己也可以寫程序來管理內(nèi)存中的bean或者把bean屬性放在配置文件里面的,JMX就是多加了一層規(guī)范.Jboss的JMX機(jī)制很方便,真的就叫熱插拔了.

    消息機(jī)制管理:JMS,這項(xiàng)我也只是看了些例子而已,還沒在項(xiàng)目中應(yīng)用過.

    任務(wù)調(diào)控:quartz,不明白什么是任務(wù)調(diào)控嗎?你想一想,比如你想在每天的某一個(gè)時(shí)間執(zhí)行一些操作,比如定時(shí)更新數(shù)據(jù)庫(kù)中的某些數(shù)據(jù)啦.當(dāng)然數(shù)據(jù)庫(kù)系統(tǒng)也有這種功能,但是如果想用程序來控制的話,就用它吧.不好的地方就是文檔太少了,上回為了搞明白它怎么用的,源代碼就翻了好久.

    重量級(jí)的東西:EJB,這個(gè)嘛,嗯................................電信金融行業(yè)的可能覺得這東西很重要,不過我們嘛,就不說這東西了,沒有發(fā)言權(quán).

    現(xiàn)在的框架都有一個(gè)理念,那就是可配置,任何東西都要可配置的.struts的配置啦,hibernate的配置啦,spring的配置啦,ibats的配置啦.但是有個(gè)有東西冒出來了,rails on ruby,它有個(gè)理念,就是"習(xí)慣優(yōu)于配置",你不明白嗎?想想,自己最好什么東西都不用配置,一切根據(jù)用戶的習(xí)慣定制好.當(dāng)然,這樣對(duì)于開發(fā)是非常方便的.而第二個(gè)方便的地方,就是代碼自動(dòng)生成(腦海里突然想起.net了)!

    說到代碼自動(dòng)生成的話,提一個(gè)xdoclet:要用這個(gè)的話,得先了解一下ant,xdoclet是個(gè)很有用的東西.不過我比較俗,我就是用它生成一個(gè)業(yè)務(wù)層或DAO的實(shí)現(xiàn)類和接口類代碼.如果Java想要有跟Rails on ruby一樣的東西的話,一定要用到xdoclet來了

    其實(shí)現(xiàn)在也有一個(gè)框架,它號(hào)稱是Java中的Rails on Ruby,那就是JdonFramework了,上回看了看,沒啥感覺,沒有Rails on Ruby給的震憾大

    驗(yàn)證碼的生成:就是在輸入頁面A中嵌入一個(gè)生成驗(yàn)證碼的頁面B,B里面有Java代碼,生成隨機(jī)字符串,再把字符串存入Session中.

    Oracle:一直識(shí)別不了本地服務(wù)。后面才發(fā)現(xiàn),是tnsnames.ora這個(gè)文件中,有的版本不支持SERVER_NAME,而只是支持SERVER。

    有想過訪問dll文件嗎?有個(gè)東西叫JDI,步驟麻煩了點(diǎn)的東西

    處理圖片:sun公司有個(gè)開源軟件jimi,是個(gè)不錯(cuò)的東西,處理圖片的開源包有很多種,我那時(shí)候?yàn)槭裁催x了jimi也忘了,好像是因?yàn)楦袷街Р恢С值脑虬?


    文章來源:http://blog.csdn.net/Wingel/archive/2006/05/26/756682.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(231) | 評(píng)論 (0)編輯 收藏

    Propagation behavior:

    PROPAGATION_MANDATORY:
     Indicates that the method must run within a transaction. If no
     existing transaction is in progress, an exception will be thrown.


    PROPAGATION_NESTED:
     Indicates that the method should be run within a nested transaction
     if an existing transaction is in progress. The nested transaction
     can be committed and rolled back individually from the enclosing
     transaction. If no enclosing transaction exists, behaves like
    PROPAGATION_REQUIRED:
     Beware that vendor support for this propagation behavior is spotty at best.
     Consult the documentation for your resource  manager to determine if nested
     transactions are supported.
    PROPAGATION_NEVER:
     Indicates that the current method should not run within a transactional
     context. If there is an existing transaction in progress, an
     exception will be thrown.
    PROPAGATION_NOT_SUPPORTED:
     Indicates that the method should not run within a transaction. If an
     existing transaction is in progress, it will be suspended for the
     duration of the method. If using JTATransactionManager,
     access to TransactionManager is required.
    PROPAGATION_REQUIRED:
     Indicates that the current method must run within a transaction. If
     an existing transaction is in progress, the method will run within
     that transaction. Otherwise, a new transaction will be started.
    PROPAGATION_REQUIRES_NEW:
     Indicates that the current method must run within its own transaction.
     A new transaction is started and if an existing transaction is in
     progress, it will be suspended for the duration of the method. If
     using JTATransactionManager, access to Transaction-
     Manager is required.
    PROPAGATION_SUPPORTS:
     Indicates that the current method does not require a transactional
     context, but may run within a transaction if one is already in
     progress.


    Isolation levels:
    In a typical application, multiple transactions run concurrently, often working
    with the same data to get their job done. Concurrency, while necessary, can lead
    to the following problems:
     ■ Dirty read—Dirty reads occur when one transaction reads data that has
     been written but not yet committed by another transaction. If the
     changes are later rolled back, the data obtained by the first transaction
     will be invalid.
     ■ Nonrepeatable read—Nonrepeatable reads happen when a transaction performs
     the same query two or more times and each time the data is different.
     This is usually due to another concurrent transaction updating the
     data between the queries.
     ■ Phantom reads—Phantom reads are similar to nonrepeatable reads. These
     occur when a transaction (T1) reads several rows, then a concurrent transaction
     (T2) inserts rows. Upon subsequent queries, the first transaction
     (T1) finds additional rows that were not there before.


    Isolation level:
    ISOLATION_DEFAULT:
     Use the default isolation level of the underlying datastore.
    ISOLATION_READ_UNCOMMITTED:
     Allows you to read changes that have not yet been committed. May
     result in dirty reads, phantom reads, and nonrepeatable reads.
    ISOLATION_READ_COMMITTED:
     Allows reads from concurrent transactions that have been committed.
     Dirty reads are prevented, but phantom and nonrepeatable
     reads may still occur.
    ISOLATION_REPEATABLE_READ:
     Multiple reads of the same field will yield the same results, unless
     changed by the transaction itself. Dirty reads and nonrepeatable
     reads are prevented by phantom reads may still occur.
    ISOLATION_SERIALIZABLE:
     This fully ACID-compliant isolation level ensures that dirty reads,
     nonrepeatable reads, and phantom reads are all prevented. This is
     the slowest of all isolation levels because it is typically accomplished
     by doing full table locks on the tables involved in the transaction. 


    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414826.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(212) | 評(píng)論 (0)編輯 收藏

    以前的版本是webwork2.2+spring m4+hibernate3.1的.
    有一回在網(wǎng)上看到hibernate3.2的發(fā)布了. 一直都覺得寫hibernate的映射文件是一件苦力活,于是就決定用一下hibernate的annotation.
    升級(jí)的時(shí)候,還真是出了一堆的問題.
    要嘛是ecache的問題,要嘛又是hibernate的second level cache的問題,用了spring自帶的hibernate包有問題,但用了hibernate網(wǎng)站上下載的包又有問題.
    最后,去spring下了最新的發(fā)布版本,又用了hibernate的3.2GA版,終于,問題解決了.反正都升級(jí)了一部分了,后面決定,將webwork也升級(jí)到了最新版本2.24,
    然后將以前寫的自定義標(biāo)簽再升級(jí)一下,也像webwork一樣改用freemarker做模板.
    于是手頭上一個(gè)在webwork+spring+hibernate的最新開發(fā)框架出爐了.
    決定,接下來的兩個(gè)項(xiàng)目就用這個(gè)框架.



     
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414831.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(247) | 評(píng)論 (0)編輯 收藏

        上回有一段時(shí)間,做了個(gè).net的項(xiàng)目, 于是就上網(wǎng)查了一些.net的開源框架,發(fā)現(xiàn)很多都是Java下的開源框架改寫的。而正如spring在Java語言的地位,.net下比較火的開源框架蠻多是Castle出的。看了一個(gè)叫MonoRails的MVC框架,是從ROR下吸收了一些思想。大致看了一下,發(fā)現(xiàn)還是有很多特性是比較好的。
        于是有感而發(fā),就在Java下也做了一個(gè)類似MonoRails的框架,大致是具有了以下的一些特性:
        Webwork的Interceptor機(jī)制。
        具有IOC,用Setter的注射法,不用配置文件,加annotation即可
        而比較主要的就是,一次請(qǐng)求的流程是,servlet自動(dòng)根據(jù)請(qǐng)求尋找以名字匹配的Model和Control,將參數(shù)和值注入Model中,轉(zhuǎn)到Control去處理,再根據(jù)Control的結(jié)果去找相應(yīng)的頁面。而這里有些是從MonoRails學(xué)來的特性:缺省的,頁面的文件名就是Control中的方法名,頁面所在的文件夾就是Control的類名。這樣就省了很多配置和寫跳轉(zhuǎn)結(jié)果的代碼。
        如果url中請(qǐng)求的方法名在這個(gè)Control中不存在的話,就經(jīng)過interceptor后直接去找頁面,也就是說,不經(jīng)過Control處理了。
        還有一點(diǎn),很爽的就是Layout的功能:在Control里面的方法加個(gè)Annotation,Layout,Layout寫上頁面框架的文件名,則每個(gè)跳轉(zhuǎn)出來的頁面,自動(dòng)內(nèi)嵌到頁面框架中。這點(diǎn)就有點(diǎn)類似sitemesh了。
        這個(gè)MVC框架做完后,大致就這些功能。可惜,這個(gè)框架就是一個(gè)自己寫著好玩的框架,并沒有用在實(shí)際的開發(fā)項(xiàng)目中,如果有機(jī)會(huì)的話,還真希望將這個(gè)框架做完整,到網(wǎng)上開源。

       

     
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414832.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(232) | 評(píng)論 (0)編輯 收藏

      應(yīng)上回幾位同事的建議,決定在這周的技術(shù)講座上講一下java的annotation的用法。前面講了annotation和interface,abstract的區(qū)別,以及各自的優(yōu)缺點(diǎn),后來就只講annotation的用法了,講到annotation可以放在3個(gè)地方,類,屬性和方法,然后順便提了一下說,可以設(shè)計(jì)這樣一個(gè)框架,在屬性上加一個(gè)annotation,就可以實(shí)現(xiàn)驗(yàn)證的功能。
      有一位同事聽了,當(dāng)場(chǎng)就提出說,可不可以寫個(gè)例子來看看,怎么實(shí)現(xiàn)這個(gè)驗(yàn)證。
      這倒也難不倒我,赫拉赫拉,當(dāng)場(chǎng)就開始寫,20多分鐘后,這個(gè)粗略的結(jié)構(gòu)就出來了,因?yàn)橐郧皼]試過在屬性里面加annotation,結(jié)果竟然發(fā)現(xiàn)不知道怎么取出屬性的annotation,用java.beans這個(gè)包,竟然取不出annotaion,用java.lang.reflect里面的field可以取出annotation,可是卻不知道怎么取java bean的標(biāo)準(zhǔn)屬性。
    最后沒辦法,講座上沒時(shí)間研究,就決定把驗(yàn)證的annotation加到每個(gè)屬性的getter方法里面。
      這次的講座講得倒也算不錯(cuò),贊自己一個(gè)。
    ????
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414833.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(225) | 評(píng)論 (0)編輯 收藏

    ?  今天要配置hibernate時(shí),決定用一下annotation配置OneToMany跟ManyToOne,結(jié)果在取Parent那一層的所有記錄時(shí),老是多取出一些數(shù)據(jù),還以為配置配錯(cuò)了,研究了半天,后來想一下,會(huì)不會(huì)是cache的問題,一試,果然是。
      因?yàn)槊看握{(diào)試的時(shí)候,都會(huì)重啟一下Web服務(wù)器,所以都忽略了Cache的問題。看來,還是要注意一下序列化到磁盤中的cache數(shù)據(jù)的。
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414834.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(214) | 評(píng)論 (0)編輯 收藏

    在一個(gè)Swing的項(xiàng)目中,每個(gè)控制用戶操作的action都是用new出來的,所以還要手動(dòng)set一些被spring管理的對(duì)象。
    后來實(shí)在受不了這些冗余的代碼了,寫代碼的時(shí)候有時(shí)候又可能會(huì)把spring的對(duì)象跟非spring的對(duì)象順序弄亂了,讓代碼結(jié)構(gòu)不清晰,在spring2的介紹中,聽說它連new出來的對(duì)象都可以管理,便去下了spring rc3來,布署到項(xiàng)目中。
      研究了半天,才發(fā)現(xiàn)其實(shí)是很容易的事,可憐我們看文檔看了半天。
    1。虛擬機(jī)加個(gè)參數(shù):-javaagent:lib/aspectjweaver.jar(后面是spring帶的aspectjweaver.jar的路徑)
    2。在spring配置文件里面加:??? <aop:spring-configured/>
    3。在要被管理的類中加上annotation:@Configurable(autowire = Autowire.BY_TYPE) autowire應(yīng)該不用說了。??
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414836.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(195) | 評(píng)論 (0)編輯 收藏

      我們一般項(xiàng)目中,都是把字典存到數(shù)據(jù)庫(kù)中的。幾個(gè)月前在做一個(gè)政府的項(xiàng)目中,覺得其實(shí)一些字典是跟開發(fā)工程緊密結(jié)合在一起的,也就是說字典變了,工程肯定也要變,這樣子的字典如果也存到數(shù)據(jù)庫(kù)中的話,也是多增加一些麻煩而已,后來但將這些字典寫成枚舉。然后數(shù)據(jù)庫(kù)里面取的所謂的字典的key就是枚舉的name,如:"unsubmited",而前臺(tái)頁面顯示的,就是枚舉的一個(gè)屬性text,不過這里用到了webwork里面的ognl語法。

    /**
    ?*?Author:?Wingel
    ?*?Date:?2006-7-29
    ?*?Time:?15:17:52
    ?
    */

    public ? enum ?ApplicationState? {
    ????unsubmited(
    " 未提交 " ),submited( " 提交/待審批 " ),agreed( " 通過 " ),disagreed( " 未同意 " );
    ????
    private ?String?text;

    ????ApplicationState(String?text)?
    {
    ????????
    this .text? = ?text;
    ????}


    ????
    public ? static ?String?getText(String?name)? { // 給頁面用的方法
    ???????? try ? {
    ????????????
    return ?valueOf(name).text;
    ????????}
    ? catch ?(Exception?e)? {
    ????????????
    return ? null ;
    ????????}

    ????}


    ????
    public ?String?getText()? {
    ????????
    return ?text;
    ????}


    ????
    public ? static ? boolean ?isValidRegisterType(String?name)? {
    ????????
    try ? {
    ????????????valueOf(name);
    ????????????
    return ? true ;
    ????????}
    ? catch ?(Exception?e)? {
    ????????????
    return ? false ;
    ????????}

    ????}


    ????
    public ? static ?ApplicationState[]?allState()? {
    ????????
    return ?ApplicationState.values();
    ????}


    ????
    public ?String?getName()? {
    ????????
    return ? this .name();
    ????}

    }



    ?

    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414837.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(1296) | 評(píng)論 (0)編輯 收藏

    ??? sitemesh的一個(gè)問題,在web.xml中設(shè)置filter的時(shí)候,讓sitemesh可以過濾/*也就是所有的后綴名,但是在decorate.xml文件里面,并沒有給sitemesh增加gif,jpg等后綴的pattern,結(jié)果在打開頁面的時(shí)候,發(fā)現(xiàn)所有的圖像文件都引用失敗,用resin3的話,它會(huì)報(bào)錯(cuò)說error content length,而用resin2或者tomcat的時(shí)候,它連報(bào)錯(cuò)都沒有。弄了半天,都不明白是怎么回事,后來才想到有可能是sitemesh的問題,修改的filter的設(shè)置,讓它只過濾部分后綴名,結(jié)果就沒事了。
    ?
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414840.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(204) | 評(píng)論 (0)編輯 收藏

        到了新公司了,上車的地點(diǎn)也不一樣了。以前經(jīng)常會(huì)陪女友一起走到她公司的門口,把她哄進(jìn)去了,自己再去坐車。而今,女友經(jīng)常要一個(gè)人走到公司了,想到女友要一個(gè)人走那一段路,竟然會(huì)心很疼。路就是那么一小段路,她也經(jīng)常會(huì)有自己走路的時(shí)候,可是就是會(huì)心疼。唉,也許照顧一個(gè)人久了,當(dāng)有一天看到?jīng)]有你照顧的她時(shí),不只她會(huì)覺得難受,你也會(huì)心疼的。
     
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414820.aspx
    posted @ 2006-11-29 11:20 Wingel 閱讀(182) | 評(píng)論 (0)編輯 收藏

    有一位好朋友,告訴我一件事情,然后突然跟我說,你可不要跟你老婆講哦,我一想,這也是一件挺三八的事情,不講就不講了,于是就說好,然后真的就沒有講了.
    后來老婆知道了這件事情后,對(duì)我大發(fā)雷霆,說我們倆人之間怎么可以有事情不說呢.
    我剛開始還沒什么覺悟,后來被老婆的一番教導(dǎo),又一番教導(dǎo),再一番教導(dǎo),這樣循環(huán)一百遍啊一百遍.
    我,終于,
    覺悟了,深深的意識(shí)到自己的錯(cuò)誤,所以我在這邊檢討,我以后再不做這種事情了. 
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414821.aspx
    posted @ 2006-11-29 11:20 Wingel 閱讀(189) | 評(píng)論 (0)編輯 收藏

        上回有一段時(shí)間,做了個(gè).net的項(xiàng)目, 于是就上網(wǎng)查了一些.net的開源框架,發(fā)現(xiàn)很多都是Java下的開源框架改寫的。而正如spring在Java語言的地位,.net下比較火的開源框架蠻多是Castle出的。看了一個(gè)叫MonoRails的MVC框架,是從ROR下吸收了一些思想。大致看了一下,發(fā)現(xiàn)還是有很多特性是比較好的。
        于是有感而發(fā),就在Java下也做了一個(gè)類似MonoRails的框架,大致是具有了以下的一些特性:
        Webwork的Interceptor機(jī)制。
        具有IOC,用Setter的注射法,不用配置文件,加annotation即可
        而比較主要的就是,一次請(qǐng)求的流程是,servlet自動(dòng)根據(jù)請(qǐng)求尋找以名字匹配的Model和Control,將參數(shù)和值注入Model中,轉(zhuǎn)到Control去處理,再根據(jù)Control的結(jié)果去找相應(yīng)的頁面。而這里有些是從MonoRails學(xué)來的特性:缺省的,頁面的文件名就是Control中的方法名,頁面所在的文件夾就是Control的類名。這樣就省了很多配置和寫跳轉(zhuǎn)結(jié)果的代碼。
        如果url中請(qǐng)求的方法名在這個(gè)Control中不存在的話,就經(jīng)過interceptor后直接去找頁面,也就是說,不經(jīng)過Control處理了。
        還有一點(diǎn),很爽的就是Layout的功能:在Control里面的方法加個(gè)Annotation,Layout,Layout寫上頁面框架的文件名,則每個(gè)跳轉(zhuǎn)出來的頁面,自動(dòng)內(nèi)嵌到頁面框架中。這點(diǎn)就有點(diǎn)類似sitemesh了。
        這個(gè)MVC框架做完后,大致就這些功能。可惜,這個(gè)框架就是一個(gè)自己寫著好玩的框架,并沒有用在實(shí)際的開發(fā)項(xiàng)目中,如果有機(jī)會(huì)的話,還真希望將這個(gè)框架做完整,到網(wǎng)上開源。

       

     
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414832.aspx
    posted @ 2006-11-29 11:20 Wingel 閱讀(227) | 評(píng)論 (0)編輯 收藏

    上回碰到一個(gè)項(xiàng)目要求是要求寫一個(gè)桌面程序,而這個(gè)程序的要求是越少占用資源越好,越小越好。
    雖然最近一直在寫swing的程序,但Java肯定是不能用了,因?yàn)檫€怎么打包都要8M以上;.net的winform也是不能用了,;就只剩三個(gè)選擇了,Delphi,VB跟MFC,MFC實(shí)在是不想用,就先試了下用VB寫,正在寫得很不爽的時(shí)候,在某個(gè)地方查到VB還要拷一些dll文件才能正常運(yùn)行,于是就只剩下Delphi,后來終于在很痛苦的情況下,把程序完成了,唉,好的IDE用習(xí)慣了,對(duì)它的依賴也變得很多。(沒錯(cuò),我這里就是在暗示Delphi這個(gè)IDE真TMD太差了)
      后來才聽說了,C++有個(gè)庫(kù),叫QT,寫桌面程序非常的不錯(cuò),還很像swing。嗚!真TMD的知道得太遲了,還被折磨了很久,查了暴多的資料。 
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414851.aspx
    posted @ 2006-11-29 11:20 Wingel 閱讀(287) | 評(píng)論 (0)編輯 收藏

    with MVC:the C will never know about V,it just access the M,and V will change according to the M.
    文章來源:http://blog.csdn.net/Wingel/archive/2006/05/26/756667.aspx
    posted @ 2006-11-29 11:20 Wingel 閱讀(173) | 評(píng)論 (0)編輯 收藏


    終于,工作也將近一年了,從4月份的開始實(shí)習(xí),到現(xiàn)在,唉,經(jīng)歷的不知道算多不多,學(xué)到的也不知道算多不多,反正現(xiàn)在就寫一篇總結(jié),對(duì)自己有個(gè)認(rèn)識(shí)吧。
    2005年4月份的時(shí)候,辭掉了一家在廈門工資還算不錯(cuò)的公司,進(jìn)入了現(xiàn)在所在的這家公司實(shí)習(xí),那時(shí)候是很肯定的覺得自己做的沒有錯(cuò),現(xiàn)在呢,我還是認(rèn)為選的沒錯(cuò),只可惜,工資一下子就少了600多了。中間也拒了幾家有些名氣的公司,說實(shí)在,有時(shí)候還真不能百分百肯定,那時(shí)候選這家公司是否是最正確的選擇。
    總體上,被錄用的做技術(shù)的公司的,進(jìn)去分別是做這三種技術(shù)的東西,一家是Windows mobile,一些是.net,還有現(xiàn)在這家的J2EE。.net能學(xué)多少東西是不知道啦,不過前半年里在開發(fā)J2EE時(shí),覺得自己真的學(xué)到很多,工作了半年以后,就有點(diǎn)迷茫,自己學(xué)的夠嗎?
    4月份在這家公司是以實(shí)習(xí)的身份進(jìn)來的,在實(shí)習(xí)的這段時(shí)間里,學(xué)會(huì)了struts和hibernate的基本應(yīng)用,也用這些框架做了幾個(gè)小模塊,由于中間要用到了一個(gè)統(tǒng)計(jì)圖,去了解并采用了jfreechart,也算是順便學(xué)了這個(gè)開源包吧。等我向項(xiàng)目經(jīng)理確認(rèn)我可以像其他員工那樣完成任務(wù)時(shí),才結(jié)束實(shí)習(xí),回到學(xué)校。
    7月份畢業(yè)出來,回到這家公司時(shí),一開始做的,就是維護(hù)公司自己的OA系統(tǒng)。第一個(gè)周是做原有模塊的修改工作,因?yàn)樵趯W(xué)校玩了一段時(shí)間,剛開始做的時(shí)候還真有一點(diǎn)生疏。
    第一周的任務(wù)完成后,開始上手了,接下來,就開始增加兩個(gè)新的客服模塊了。這兩個(gè)模塊用了三周完成,這三周里面,也學(xué)會(huì)了一個(gè)不刷新技術(shù)(后來才知道,這叫AJAX),并在剩余的時(shí)間里面,比較大的收獲就是掌握struts-menu這個(gè)開源包的普通應(yīng)用。
    8月份的前兩周,開始做一個(gè)薪資審批的流程,也算是第一次接觸工作流了。這次做的這個(gè)模塊,并沒有學(xué)到什么新的技術(shù),就是業(yè)務(wù)邏輯很復(fù)雜的編碼,但是想想自己也剛工作沒幾天,這對(duì)我來說,益處還是很大的。
    接下來的一個(gè)月里,做的是OA上添加一個(gè)跟企業(yè)的運(yùn)營(yíng)平臺(tái)整合的企業(yè)注冊(cè)模塊,這個(gè)模塊一開始看業(yè)務(wù)還是很簡(jiǎn)單的,后面功能慢慢添加,竟然做了一個(gè)月才完成,期間抽空了解了一個(gè)在線編輯HTML的東西,而我想主要的,這個(gè)模塊有很多突發(fā)事情和意外要考慮,跟以前做的那些相比,這次的這個(gè)模塊,才是真正煅煉程序員能力的編程吧。已經(jīng)到9月份的中旬了,那個(gè)注冊(cè)企業(yè)模塊也終于完成了,現(xiàn)在回想起來,做那個(gè)模塊用的最有技術(shù)含量的東西,應(yīng)該是Ajax吧(我并沒有用什么開源的框架,如果現(xiàn)在有人要嘲笑我說,“你只是簡(jiǎn)單的一些不刷新,也叫Ajax,真搞笑”,那我只能說,果然不只文人相輕,做技術(shù)的也看不起做技術(shù)的。
    剛做完這個(gè)企業(yè)注冊(cè)模塊,項(xiàng)目經(jīng)理問我說:“你以前用過.net吧。”我告訴他是的。沒想到,一個(gè)任務(wù)就來了,把一個(gè)aspx+C#做的短信業(yè)務(wù)管理網(wǎng)站修改一下,因?yàn)槔锩娑际沁m合SQL Server的數(shù)據(jù)庫(kù),而且用到很多存儲(chǔ)過程,現(xiàn)在想遷到Oracle上。而一周后,終于把這個(gè)項(xiàng)目改成適合于大部分?jǐn)?shù)據(jù)庫(kù)的,去掉所有存儲(chǔ)過程,增加了日志功能。這次的這個(gè)任務(wù)并沒有煅煉到什么J2EE的能力,不過也算再熟悉了一下.net,再次感受了.net的人性化,可惜有些功能還是沒有Jbuilder好。接下來,又是修改了一個(gè)用EJB做的工程中的一些模塊,和調(diào)整了OA中的一部分功能。期間也搭建了一個(gè)Tapetry的工程,算是感受了他一把,不過還是覺得它沒有struts好用。
    接下來的這個(gè)月,是我學(xué)得最多的一個(gè)月了,公司想把以前的C/S二層結(jié)構(gòu)改為Delphi做界面層,用Java做中間服務(wù)層,最后再數(shù)據(jù)庫(kù)服務(wù)器。他們最先考慮到的是,用Web service。于是我的任務(wù)就下來了,研究一下Web service,看能不能做一個(gè)框架滿足公司的要求。我起先則是用axis搭建Web service,后面發(fā)現(xiàn),它實(shí)在是太復(fù)雜了,我們想要的,是一個(gè)輕便的東西。
    于是就開始研究SOAP,因?yàn)閃eb service就是用SOAP傳輸消息的。SOAP然后是javaxml,接著是dom4j。后面自己產(chǎn)生一個(gè)想法,如果客戶端傳遞一個(gè)XML過來,里面描述了要調(diào)用的類名,方法名,以及傳遞的參數(shù)對(duì)象。服務(wù)端解析XML出來,利用反射和序列化XML轉(zhuǎn)化為本地化持久類,調(diào)用這個(gè)方法,再把方法返回的對(duì)象轉(zhuǎn)化成XML返回給客戶端,那么不就可以實(shí)現(xiàn)客戶端自由調(diào)用Java的類。
    有了這個(gè)想法就很興奮,開始付諸行動(dòng)。很幸運(yùn)的是,我把這個(gè)框架做出來了,那時(shí)候真的很興奮,因?yàn)樵谖乙詾椋莻€(gè)類型的框架還從來沒有看見過,甚至想把它放到網(wǎng)上開源去。后來才意識(shí)到,其實(shí)我做的這個(gè)就是輕量的沒有規(guī)范的Web service。既然這樣,后面又給它增加了類似wsdl的功能,而后在優(yōu)化過程中,增加了cache,大大提高了速度。測(cè)試了一下,完成同樣的功能,它的速度是axis web service的十幾倍,呵呵呵呵呵,那個(gè)叫興奮啊。那也是一次性把Java的幾項(xiàng)關(guān)鍵技術(shù)一起學(xué)了順便用上。
    做完這個(gè)框架后,又做了兩個(gè)項(xiàng)目,一個(gè)交通查詢的,一個(gè)社區(qū)。這兩個(gè)項(xiàng)目倒也沒有像上回研究Web service那樣令人興奮的感覺了,不過還是學(xué)了很多開源的東西和技術(shù)。交通查詢很多次用到Ajax,也在做這個(gè)項(xiàng)目的期間,學(xué)到了幾項(xiàng)J2EE技術(shù),在一次用JavaScript做樹狀控件的時(shí)候,大大了提高了Javascript一把。而在此,也總結(jié)到,其實(shí)懂不懂一些新技術(shù)并不是主要的,新技術(shù)很容易就可以用起來,而難的,就是決定用哪些技術(shù),哪些模式,直至如何來設(shè)計(jì)自己的框架。很幸運(yùn)的,在做那個(gè)社區(qū)的時(shí)候,我有了這個(gè)機(jī)會(huì)。
    除此以外,做這個(gè)社區(qū)的時(shí)候其他令人激動(dòng)的事情,就是寫了幾個(gè)復(fù)雜的標(biāo)簽,學(xué)到了velocity和全文搜索Lucene了。
    之后,就是發(fā)生一些跟技術(shù)無關(guān)的不如人意的事情了。

    文章來源:http://blog.csdn.net/Wingel/archive/2006/05/26/756669.aspx
    posted @ 2006-11-29 11:20 Wingel 閱讀(223) | 評(píng)論 (0)編輯 收藏

    一些有名的Java網(wǎng)站
    文章來源:http://blog.csdn.net/Wingel/archive/2006/08/10/1046624.aspx
    posted @ 2006-11-29 11:20 Wingel 閱讀(179) | 評(píng)論 (0)編輯 收藏

    一些笑話
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414818.aspx
    posted @ 2006-11-29 11:20 Wingel 閱讀(237) | 評(píng)論 (0)編輯 收藏

        今天再一次看了《大道至簡(jiǎn)》,覺得還是有挺多地方不懂的,當(dāng)然,不是說這本書就是一本圣經(jīng),必須要完完全全的理解,只不過,目前以我的層次來講,體會(huì)得越多,走錯(cuò)的步子就會(huì)越少.
       
        目前,我想記住兩句話:
        工具->方法->工程->過程->組織

        我用了一年的時(shí)間,從工具->方法.我很急!但我又清醒的知道我要穩(wěn)穩(wěn)的走!唉~

        "實(shí)現(xiàn)"的欲望是程序員出身的通病.無論是從結(jié)構(gòu)上,還是模式上,那是細(xì)節(jié). 


    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414822.aspx
    posted @ 2006-11-29 11:20 Wingel 閱讀(188) | 評(píng)論 (0)編輯 收藏

      其實(shí)這種事情都會(huì)有兩個(gè)觀點(diǎn)。
    一個(gè)觀點(diǎn)是:建議使用自己熟悉的技術(shù),采用簡(jiǎn)單的架構(gòu)去實(shí)現(xiàn)項(xiàng)目,等到你把項(xiàng)目做出來了,能用起來了,客戶認(rèn)可了。以后的升級(jí),那是你就可以比較輕松的采用其 它的架構(gòu)來重構(gòu),這樣你的風(fēng)險(xiǎn),壓力就相對(duì)減少很多了。
    而這回,我想頂一下第二個(gè)觀點(diǎn):  
      其實(shí)如果你對(duì)代碼要求比較嚴(yán)格的話,你就會(huì)經(jīng)常發(fā)現(xiàn),你的代碼有很多東西可以抽取出來,或者做在公共的模塊,或者作為框架的底層,我們就簡(jiǎn)單的拿jdbc來說吧,
        首先,是connection的管理,這點(diǎn)一般用jdbc熟一些的話,都會(huì)有管理connection的公共模塊,雖然偶爾會(huì)碰到性能的問題,但是這點(diǎn)我們暫且壓下不表。
        我們查詢的時(shí)候,每次都要用
        rs.get...("name"),
        rs.get...("id"),
        rs.get...("age"),
        rs.get...("gender"),
        rs.get...("hobby"),
        然后修改數(shù)據(jù)庫(kù)的時(shí)候,還要拼寫update語句跟insert語句,經(jīng)常還要費(fèi)很多時(shí)間來調(diào)試這些多余代碼的問題,這時(shí)候你就想,不行,我一定要寫一個(gè)公共模塊,省得讓我每次都要定這么多代碼,于是你的第一個(gè)公共模塊產(chǎn)生了,然后測(cè)試啊測(cè)試,改進(jìn)啊改進(jìn),叮叮響,過了幾天時(shí)間的考驗(yàn),這個(gè)公共模塊終于可以放心使用了,項(xiàng)目進(jìn)度開始快一些了,總算不用再拼SQL了。
       
        后來在做統(tǒng)計(jì)模塊的時(shí)候,突然又發(fā)現(xiàn),之前在用到的一些SQL函數(shù),好像在客戶要求的數(shù)據(jù)庫(kù)上不怎么行啊,于是又去查了一下資料,又過了幾天(可能這次不用幾天),然后終于放心,所有的函數(shù)都正常了。
       
        接著又不可避免的碰到了分頁的問題,你對(duì)自己說,不用怕,我上回就寫了一個(gè)分頁的,沒有問題!可是Ya的你突然發(fā)現(xiàn),上回的那個(gè)分頁是用游標(biāo)實(shí)現(xiàn)的,這回客戶是要求用SQLServer,唉,SQLServer的游標(biāo),不提也罷,想來想去,只好自己拼SQL語句來寫分頁了,又是count又是top,測(cè)了又測(cè)之后,又過了幾天,啊哈,終于分頁的公共模塊也做好的,可以放心使用了,好,項(xiàng)目的進(jìn)度又可以加快了。

        做著做著的時(shí)候,發(fā)現(xiàn),咦,好像這表得增加一個(gè)字段才行,增加了,然后所有查詢的SQL語句加一下,所有insert跟update的代碼修改一下,頁面修改一下,嗯,現(xiàn)在應(yīng)該正常了,看起來倒是沒什么問題,咦,報(bào)表好像不怎么對(duì)啊,靠,這邊還有調(diào)用這個(gè)表的代碼,媽的,改吧改吧。磨蹭了好幾個(gè)小時(shí)(當(dāng)然,熟練的話,并不用幾個(gè)小時(shí)),總算看起來都正常了。

        這一回,這個(gè)功能中有一次用戶請(qǐng)求,訪問了好幾次數(shù)據(jù)庫(kù),不行,這里應(yīng)該用個(gè)cache,否則性能上會(huì)有問題啊,算了,用算法解決一下,盡量少訪問數(shù)據(jù)庫(kù)好了,我對(duì)cache還不熟呢。(寫啊寫啊,Batch Size,這樣多,那樣多,F(xiàn)etch Size。。。,終于,看起來正常一些了)。過了一段時(shí)間,靠,這邊又要訪問好幾次數(shù)據(jù)庫(kù),Ya的受不鳥了,性能愛咋的咋的,反正一個(gè)地方慢又不要緊。Oh shit!!!這邊也是好幾次,這邊又是好幾次,那邊又是好幾次。不行了,我老老實(shí)實(shí)寫個(gè)cache支持吧,于是又叮叮當(dāng)當(dāng)了好幾天,終于,有個(gè)粗糙的cache出來了,終于速度可以看一些了。后來改進(jìn)又改進(jìn),測(cè)試又測(cè)試,累死了,老子好不爽啊。

        好像天下有點(diǎn)太平了,啊,你說我這個(gè)地方忘記更新你增加的那個(gè)子表啊,算了,沒關(guān)系,我明天看一下代碼,這個(gè)容易解決點(diǎn)。嗯,我改了那邊的代碼了,會(huì)更新子表信息了。什么?你說取主表的記錄跟相應(yīng)的子表記錄列表麻煩啊,沒關(guān)系,我更新一下處理resultset的公共模塊,明天再說。
        Oh shit......對(duì)這樣子復(fù)雜的查詢好像現(xiàn)在的公共模塊支持不了啊,算了,這樣子的查詢不要用這個(gè)公共模塊,我們手動(dòng)寫一些代碼好啊,別跟我講這樣代碼結(jié)構(gòu)很難看,你以為我不知道啊,TMD。

        TMD的,怎么這邊的SQL老是運(yùn)行不了啊,不會(huì)是分頁底層模塊的問題吧,靠,怎么你的SQL語句有這么多order,group by,靠,還有top啊,這當(dāng)然過不了了,不要吵了,現(xiàn)在時(shí)間改,不理它,直接用個(gè)假分頁就行了。你又說代碼結(jié)構(gòu)難看,小心我抽你哦。

        公司新來一個(gè)程序員,看了幾天代碼,不停的抱怨說,這代碼寫得真差啊。。。。。。 


    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414852.aspx
    posted @ 2006-11-29 11:20 Wingel 閱讀(289) | 評(píng)論 (2)編輯 收藏

    Propagation behavior:

    PROPAGATION_MANDATORY:
     Indicates that the method must run within a transaction. If no
     existing transaction is in progress, an exception will be thrown.


    PROPAGATION_NESTED:
     Indicates that the method should be run within a nested transaction
     if an existing transaction is in progress. The nested transaction
     can be committed and rolled back individually from the enclosing
     transaction. If no enclosing transaction exists, behaves like
    PROPAGATION_REQUIRED:
     Beware that vendor support for this propagation behavior is spotty at best.
     Consult the documentation for your resource  manager to determine if nested
     transactions are supported.
    PROPAGATION_NEVER:
     Indicates that the current method should not run within a transactional
     context. If there is an existing transaction in progress, an
     exception will be thrown.
    PROPAGATION_NOT_SUPPORTED:
     Indicates that the method should not run within a transaction. If an
     existing transaction is in progress, it will be suspended for the
     duration of the method. If using JTATransactionManager,
     access to TransactionManager is required.
    PROPAGATION_REQUIRED:
     Indicates that the current method must run within a transaction. If
     an existing transaction is in progress, the method will run within
     that transaction. Otherwise, a new transaction will be started.
    PROPAGATION_REQUIRES_NEW:
     Indicates that the current method must run within its own transaction.
     A new transaction is started and if an existing transaction is in
     progress, it will be suspended for the duration of the method. If
     using JTATransactionManager, access to Transaction-
     Manager is required.
    PROPAGATION_SUPPORTS:
     Indicates that the current method does not require a transactional
     context, but may run within a transaction if one is already in
     progress.


    Isolation levels:
    In a typical application, multiple transactions run concurrently, often working
    with the same data to get their job done. Concurrency, while necessary, can lead
    to the following problems:
     ■ Dirty read—Dirty reads occur when one transaction reads data that has
     been written but not yet committed by another transaction. If the
     changes are later rolled back, the data obtained by the first transaction
     will be invalid.
     ■ Nonrepeatable read—Nonrepeatable reads happen when a transaction performs
     the same query two or more times and each time the data is different.
     This is usually due to another concurrent transaction updating the
     data between the queries.
     ■ Phantom reads—Phantom reads are similar to nonrepeatable reads. These
     occur when a transaction (T1) reads several rows, then a concurrent transaction
     (T2) inserts rows. Upon subsequent queries, the first transaction
     (T1) finds additional rows that were not there before.


    Isolation level:
    ISOLATION_DEFAULT:
     Use the default isolation level of the underlying datastore.
    ISOLATION_READ_UNCOMMITTED:
     Allows you to read changes that have not yet been committed. May
     result in dirty reads, phantom reads, and nonrepeatable reads.
    ISOLATION_READ_COMMITTED:
     Allows reads from concurrent transactions that have been committed.
     Dirty reads are prevented, but phantom and nonrepeatable
     reads may still occur.
    ISOLATION_REPEATABLE_READ:
     Multiple reads of the same field will yield the same results, unless
     changed by the transaction itself. Dirty reads and nonrepeatable
     reads are prevented by phantom reads may still occur.
    ISOLATION_SERIALIZABLE:
     This fully ACID-compliant isolation level ensures that dirty reads,
     nonrepeatable reads, and phantom reads are all prevented. This is
     the slowest of all isolation levels because it is typically accomplished
     by doing full table locks on the tables involved in the transaction. 


    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414826.aspx
    posted @ 2006-11-29 11:19 Wingel 閱讀(201) | 評(píng)論 (0)編輯 收藏

    here are four isolation levels:

  • READ UNCOMMITTED (在一個(gè)事務(wù)中,可能讀到別的事務(wù)還沒提交的數(shù)據(jù))
  • READ COMMITTED(在一個(gè)事務(wù)中,同樣的語句可能查詢到不同的數(shù)據(jù),因?yàn)樵谶@兩個(gè)語句之間,別的事務(wù)更改提交了這兩個(gè)語句涉及的數(shù)據(jù))
  • REPEATABLE READ(保證一個(gè)事務(wù)A里面讀到的數(shù)據(jù)不會(huì)變,即使期間別的事務(wù)B提交更改了數(shù)據(jù),事務(wù)A中的語句仍然會(huì)讀到原來的數(shù)據(jù))
  • SERIALIZABLE(在事務(wù)期間,會(huì)將涉及的數(shù)據(jù)鎖掉,防止別的事務(wù)修改)

    SQL server實(shí)現(xiàn)了四個(gè)級(jí)別
    Oracle只實(shí)現(xiàn)中間兩個(gè)級(jí)別。
     

  • 文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414835.aspx
    posted @ 2006-11-29 11:19 Wingel 閱讀(214) | 評(píng)論 (0)編輯 收藏

    前幾天同事講了Transaction isolation level,并且大家一起在SQLServer,Oracle跟MySQL數(shù)據(jù)庫(kù)上實(shí)驗(yàn)了一下,發(fā)覺這些知識(shí)還是挺重要的。
    假如有兩個(gè)事務(wù)并發(fā),順序如下
    Transaction A            Transaction B
    begin    begin
    query1 from table A   
    .......                  modify1 to table A(insert/update/delete)
       commit
    query2 from table A
    commit

    那么在事務(wù)A中,query1跟query2查詢出來的結(jié)果是否一樣呢?這就跟事務(wù)隔離級(jí)別有關(guān)了。
    SQL的標(biāo)準(zhǔn)定義里面,一共有四種級(jí)別:
    read uncommited讀取未提交的數(shù)據(jù) 就是其他事務(wù)求提交的數(shù)據(jù),都可以讀取出來
    read commited讀取已提交的數(shù)據(jù) query2會(huì)跟query1讀取的數(shù)據(jù)不一樣
    repeatable read可重復(fù)讀取,即query1跟query2讀取的數(shù)據(jù)是一樣的
    serializable 序列化,

     SQL 標(biāo)準(zhǔn)用三個(gè)必須在并行的事務(wù)之間避免的現(xiàn)象定義了四個(gè)級(jí)別的事務(wù)隔離。 這些不希望發(fā)生的現(xiàn)象是:
    臟讀(dirty reads)
        一個(gè)事務(wù)讀取了另一個(gè)未提交的并行事務(wù)寫的數(shù)據(jù)。
    不可重復(fù)讀(non-repeatable reads)
        一個(gè)事務(wù)重新讀取前面讀取過的數(shù)據(jù), 發(fā)現(xiàn)該數(shù)據(jù)已經(jīng)被另一個(gè)已提交的事務(wù)修改過。
    幻讀(phantom read)
        一個(gè)事務(wù)重新執(zhí)行一個(gè)查詢,返回一套符合查詢條件的行, 發(fā)現(xiàn)這些行因?yàn)槠渌罱峤坏氖聞?wù)而發(fā)生了改變。
     隔離級(jí)別         臟讀(Dirty Read)  不可重復(fù)讀(NonRepeatable Read)  幻讀(Phantom Read)
    讀未提交(Read uncommitted)   可能      可能                           可能
    讀已提交(Read committed)     不可能           可能                        可能
    可重復(fù)讀(Repeatable read)    不可能             不可能                    可能
    可串行化(Serializable )      不可能              不可能                  不可能

    SQLServer
    我們首先在SQLServer上做了實(shí)驗(yàn),SQLServer一共支持四種隔離級(jí)別,read uncommited跟read commited我們沒有實(shí)驗(yàn),我們直接先實(shí)驗(yàn)
    repeatable read,如果事務(wù)A定義了如下級(jí)別,那么當(dāng)事務(wù)B執(zhí)行到modify1這條語句時(shí),如果modify1是update的話,就被鎖起來,一直等
    到事務(wù)A提交完以后,鎖才會(huì)被釋放,而如果是insert的話,剛可以順利進(jìn)行下去,然后在事務(wù)A中,query2查到的數(shù)據(jù),是已經(jīng)被事務(wù)B
    修改過的數(shù)據(jù),如果將級(jí)別定義在serializable的話,則在modify1語句中,update,insert或者delete都會(huì)被鎖掉。
    也就是說,SQLServer對(duì)這些級(jí)別的支持,是通過鎖來做到的,雖然可以保證事務(wù)正常進(jìn)行,但是并行的性能卻很差。
    Oracle
    oracle只支持兩個(gè)級(jí)別,read commited跟serializable,結(jié)果這里就不用詳細(xì)說明,實(shí)驗(yàn)的結(jié)果是,oracle的serializable是通過版本
    控制來完成的,而不是通過鎖機(jī)制,這就保證了并行的性能。Oracle的默認(rèn)級(jí)別是read commited
    MySQL
    MySQLServer也支持四個(gè)級(jí)別,而且MySQL也是通過版本控制而非鎖機(jī)制來完成的。
     


    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414839.aspx
    posted @ 2006-11-29 11:19 Wingel 閱讀(301) | 評(píng)論 (0)編輯 收藏

    僅列出標(biāo)題  下一頁
    主站蜘蛛池模板: 在人线av无码免费高潮喷水| 最近的免费中文字幕视频| 18禁无遮挡无码网站免费| 亚洲国产成人五月综合网| 亚洲AV无码一区二区二三区软件| 2020年亚洲天天爽天天噜| 一个人看的免费高清视频日本| 222www在线观看免费| 亚洲日本中文字幕天堂网| 亚洲国产成人久久| 一级毛片在线完整免费观看| 99久久99这里只有免费费精品| 亚洲色图综合在线| 亚洲一级黄色大片| 中文字幕无码日韩专区免费 | 麻豆精品成人免费国产片| 午夜无遮挡羞羞漫画免费| 亚洲第一福利网站| 美女无遮挡免费视频网站| 在免费jizzjizz在线播 | 又大又粗又爽a级毛片免费看| 亚洲日本中文字幕区| 成人免费网站久久久| 99久久综合国产精品免费| 亚洲成A∨人片在线观看不卡| 国产亚洲精彩视频| 国产免费不卡视频| 欧洲亚洲国产清在高| 国产成人精品亚洲| 人成午夜免费视频在线观看| 亚洲精品成人网站在线观看| WWW亚洲色大成网络.COM| 97国产免费全部免费观看| 亚洲成a人片在线观看无码| 免费人成网站永久| 啦啦啦手机完整免费高清观看| 色播亚洲视频在线观看| 成人无码区免费A∨直播| 免费国内精品久久久久影院| 亚洲大成色www永久网址| 亚洲免费视频播放|