<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

    2006年11月29日 #

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

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

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

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

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

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

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

    聯(lián)合兩人的知識去對付一個難題。

    知識互相傳遞。

    更有效的查錯跟糾錯。

    程序員都很開心。

    減少員工離職的損失。

    ?

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

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

    用例子來解釋。

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

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

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

    經(jīng)常的休息。

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

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

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

    TDD及它的優(yōu)點

    ?

    ??? 上面這種編程的方式,就叫“測試驅(qū)動編程Test Driven Development (TDD)”,因為我們總是在寫真正代碼之前寫一個通不過的測試,然后再寫真正的代碼,讓測試通過。

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

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

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

    ???

    ??? 2.因為廣泛的使用接口,我們的類之間就不會藕合(比如EnrollmentSet就一點都不知道StudentSet的存在),因此重用性更好。

    ?

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

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

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

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

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

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

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

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

    摘錄一些東西,具體請下附件觀看:

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

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

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

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

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

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

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

    8 以用戶例事管理項目

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

    什么是用戶例事 (user story)

    ?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      如果現(xiàn)在有一個類Parent,里面有個屬性的類型是Child,add的方法里面還有個參數(shù)的類型是Girl:
      class Parent{
    ??????? Child child;
    ?void add(Girl girl){
    ??? ...
    ?}
    ???? }
    ???? 因為上面Parent里面用到了Child跟Girl這兩個類,我們就說,Parent引用了類Child跟類Girl。現(xiàn)在的問題是,如果Child這個類或者Girl這個類編譯不過的話,那么Parent這個類也編譯不了了。也就是說,Parent依賴于Child跟Girl。這章講述的,就是因為一些類的依賴造成的無法重用的問題。

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

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

    或者點這個鏈接:

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

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

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

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

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


    然后在要驗證的Form里面加個屬性validatable=true,如下:

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

    注意,這邊不要加onsubmit方法

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

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

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

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

    </script>


    里面三個參數(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 閱讀(260) | 評論 (0)編輯 收藏

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

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

    統(tǒng)計圖:jfreechart

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

    持久層:hibernate,ibats

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    驗證碼的生成:就是在輸入頁面A中嵌入一個生成驗證碼的頁面B,B里面有Java代碼,生成隨機字符串,再把字符串存入Session中.

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

    有想過訪問dll文件嗎?有個東西叫JDI,步驟麻煩了點的東西

    處理圖片:sun公司有個開源軟件jimi,是個不錯的東西,處理圖片的開源包有很多種,我那時候為什么選了jimi也忘了,好像是因為格式支不支持的原因吧.


    文章來源:http://blog.csdn.net/Wingel/archive/2006/05/26/756682.aspx
    posted @ 2006-11-29 11:21 Wingel 閱讀(231) | 評論 (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 閱讀(213) | 評論 (0)編輯 收藏

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



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

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

       

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

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

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

    在一個Swing的項目中,每個控制用戶操作的action都是用new出來的,所以還要手動set一些被spring管理的對象。
    后來實在受不了這些冗余的代碼了,寫代碼的時候有時候又可能會把spring的對象跟非spring的對象順序弄亂了,讓代碼結(jié)構(gòu)不清晰,在spring2的介紹中,聽說它連new出來的對象都可以管理,便去下了spring rc3來,布署到項目中。
      研究了半天,才發(fā)現(xiàn)其實是很容易的事,可憐我們看文檔看了半天。
    1。虛擬機加個參數(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) | 評論 (0)編輯 收藏

      我們一般項目中,都是把字典存到數(shù)據(jù)庫中的。幾個月前在做一個政府的項目中,覺得其實一些字典是跟開發(fā)工程緊密結(jié)合在一起的,也就是說字典變了,工程肯定也要變,這樣子的字典如果也存到數(shù)據(jù)庫中的話,也是多增加一些麻煩而已,后來但將這些字典寫成枚舉。然后數(shù)據(jù)庫里面取的所謂的字典的key就是枚舉的name,如:"unsubmited",而前臺頁面顯示的,就是枚舉的一個屬性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 閱讀(1297) | 評論 (0)編輯 收藏

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

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

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

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

       

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

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


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

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

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

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

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

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


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

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

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

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

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

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

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


    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414852.aspx
    posted @ 2006-11-29 11:20 Wingel 閱讀(289) | 評論 (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 閱讀(202) | 評論 (0)編輯 收藏

    here are four isolation levels:

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

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

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

    前幾天同事講了Transaction isolation level,并且大家一起在SQLServer,Oracle跟MySQL數(shù)據(jù)庫上實驗了一下,發(fā)覺這些知識還是挺重要的。
    假如有兩個事務(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ù)隔離級別有關(guān)了。
    SQL的標(biāo)準(zhǔn)定義里面,一共有四種級別:
    read uncommited讀取未提交的數(shù)據(jù) 就是其他事務(wù)求提交的數(shù)據(jù),都可以讀取出來
    read commited讀取已提交的數(shù)據(jù) query2會跟query1讀取的數(shù)據(jù)不一樣
    repeatable read可重復(fù)讀取,即query1跟query2讀取的數(shù)據(jù)是一樣的
    serializable 序列化,

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

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


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

    here are four isolation levels:

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

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

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

    在一個Swing的項目中,每個控制用戶操作的action都是用new出來的,所以還要手動set一些被spring管理的對象。
    后來實在受不了這些冗余的代碼了,寫代碼的時候有時候又可能會把spring的對象跟非spring的對象順序弄亂了,讓代碼結(jié)構(gòu)不清晰,在spring2的介紹中,聽說它連new出來的對象都可以管理,便去下了spring rc3來,布署到項目中。
      研究了半天,才發(fā)現(xiàn)其實是很容易的事,可憐我們看文檔看了半天。
    1。虛擬機加個參數(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:18 Wingel 閱讀(111) | 評論 (0)編輯 收藏

      我們一般項目中,都是把字典存到數(shù)據(jù)庫中的。幾個月前在做一個政府的項目中,覺得其實一些字典是跟開發(fā)工程緊密結(jié)合在一起的,也就是說字典變了,工程肯定也要變,這樣子的字典如果也存到數(shù)據(jù)庫中的話,也是多增加一些麻煩而已,后來但將這些字典寫成枚舉。然后數(shù)據(jù)庫里面取的所謂的字典的key就是枚舉的name,如:"unsubmited",而前臺頁面顯示的,就是枚舉的一個屬性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:18 Wingel 閱讀(229) | 評論 (0)編輯 收藏

      以前做完類似MonoRails的那個Java框架后,一直想把MonoRails里面那個Layout的功能也加到現(xiàn)在的開發(fā)框架里面,因為那框架確實是很有用啊。舉個例子吧,以前做頁面都是這樣子做的,做一個head.jsp,一個foot.jsp,然后在每個頁面里面這樣子做:
    <jsp:include file="head.jsp">
    <.....頁面代碼>
    <jsp:include file="footer.jsp">

    而現(xiàn)在的設(shè)想就是,在每個action的方法上加一個annotation,Layout,layout就是框架頁面的路徑,比如:main.jsp
    然后在main.jsp里面:
    <頁首的代碼>
    <pageFrame:body>
    <頁尾的代碼>
    這樣多省事啊。
    兩個月前動手要加這個功能的時候,突然有人告訴我,你干嘛不用一下sitemesh,于是就去了解了一下sitemesh。

    后來放棄的原來的打算,還是用sitemesh吧。






     
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414838.aspx
    posted @ 2006-11-29 11:18 Wingel 閱讀(132) | 評論 (0)編輯 收藏

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

    前幾天同事講了Transaction isolation level,并且大家一起在SQLServer,Oracle跟MySQL數(shù)據(jù)庫上實驗了一下,發(fā)覺這些知識還是挺重要的。
    假如有兩個事務(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ù)隔離級別有關(guān)了。
    SQL的標(biāo)準(zhǔn)定義里面,一共有四種級別:
    read uncommited讀取未提交的數(shù)據(jù) 就是其他事務(wù)求提交的數(shù)據(jù),都可以讀取出來
    read commited讀取已提交的數(shù)據(jù) query2會跟query1讀取的數(shù)據(jù)不一樣
    repeatable read可重復(fù)讀取,即query1跟query2讀取的數(shù)據(jù)是一樣的
    serializable 序列化,

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

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


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

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

    用jquery碰到的問題
    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414850.aspx
    posted @ 2006-11-29 11:18 Wingel 閱讀(114) | 評論 (0)編輯 收藏

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

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

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

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

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

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

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


    文章來源:http://blog.csdn.net/Wingel/archive/2006/11/26/1414852.aspx
    posted @ 2006-11-29 11:18 Wingel 閱讀(95) | 評論 (0)編輯 收藏

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


    然后在要驗證的Form里面加個屬性validatable=true,如下:

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

    注意,這邊不要加onsubmit方法

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

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

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

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

    </script>


    里面三個參數(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:18 Wingel 閱讀(263) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 国产国拍亚洲精品福利 | 国产AV无码专区亚洲Av| 激情无码亚洲一区二区三区| 麻豆最新国产剧情AV原创免费| 亚洲AV无码1区2区久久| 免费看男人j放进女人j免费看| 国产精品亚洲不卡一区二区三区| 香蕉97碰碰视频免费| 国产偷窥女洗浴在线观看亚洲| 人碰人碰人成人免费视频| 亚洲欧洲日本在线| 99re6在线精品免费观看| 国产亚洲成av片在线观看| 日本卡1卡2卡三卡免费| 亚洲精品成人久久| 最近中文字幕mv手机免费高清| eeuss影院免费直达入口| 国产a v无码专区亚洲av| 97在线免费视频| 亚洲欧洲日产国码在线观看| 免费毛片在线看片免费丝瓜视频 | 最新亚洲人成无码网www电影| 亚洲av中文无码| a级日本高清免费看| 亚洲激情电影在线| 日韩毛片无码永久免费看| 一级一片免费视频播放| 免费可以看黄的视频s色| 中文日韩亚洲欧美制服| 免费一级毛片正在播放| 中文字幕无码毛片免费看| 亚洲精品免费在线| 国产一级特黄高清免费大片| 三上悠亚电影全集免费| 亚洲精品美女久久久久| 麻豆成人精品国产免费| 久久精品私人影院免费看| 亚洲性色精品一区二区在线| 亚洲无人区一区二区三区| 国产精品无码免费播放| aa级毛片毛片免费观看久|