michaelwang1978

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            10 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

          2005年10月8日 #

          其實,這個應用是個簡單得不能再簡單的JavaScript應用,只不過被冠以了AJAX這個今年2月份才誕生的名詞以后忽然熱了起來。AJAX這一個單詞,居然可以把一堆98年就開始用的技術推到前臺來,成為當今在特定的圈子里最熱的詞匯,倒是一個典型的tipping point(臨界點)的案例。就像99年Netcenter用的RSS終于在2002年開始被從blogger撿起來,并在2005年煥發了青春。

          這些用Javascript+XMLHTTPRequest的做法給我們提供了一個很廣闊的空間,可以有很多的想象。比如,在任何靜態的頁面里面,只要加入這段代碼也就可以擁有這個功能了。

          <script language=Javascript src="http://home.wangjianshuo.com/scripts/php/markit.php">
          </script>

          把鼠標放在上面還可以知道是從哪個IP在什么時間批注的。值得注意的是,這只是一個最簡單的SAJAX應用,如果把它應用于地圖,以及應用于多個網站之間的聯合,會有更讓人驚訝的結果出來。估計,以后客齊集的后臺的管理系統將會是最早使用這些簡單但是有效的思想的地方。

          注:那些紅線,只是在Word里面隨手畫的。
          注二:沒有經過測試,FireFox下面什么樣子不曉得,放在其他頁面怎么樣也不曉得。。

          posted @ 2005-10-21 23:05 Michael 閱讀(182) | 評論 (0)編輯 收藏

          我們期待自己成為一個優秀的軟件模型設計者,但是,要怎樣做,又從哪里開始呢? 

            將下列原則應用到你的軟件工程中,你會獲得立桿見影的成果。 

            1. 人遠比技術重要 

            你開發軟件是為了供別人使用,沒有人使用的軟件只是沒有意義的數據的集合而已。許多在軟件方面很有成就的行家在他們事業的初期卻表現平平,因為他們那時侯將主要精力都集中在技術上。顯然,構件(components),EJB(Enterprise Java Beans)和代理(agent)是很有趣的東西。但是對于用戶來說,如果你設計的軟件很難使用或者不能滿足他們的需求,后臺用再好的技術也于事無補。多花點時間到軟件需求和設計一個使用戶能很容易理解的界面上。 
           
            2. 理解你要實現的東西 

            好的軟件設計人員把大多數時間花費在建立系統模型上,偶爾寫一些源代碼,但那只不過是為了驗證設計過程中所遇到的問題。這將使他們的設計方案更加可行。 

            3. 謙虛是必須的品格 

            你不可能知道一切,你甚至要很努力才能獲得足夠用的知識。軟件開發是一項復雜而艱巨的工作,因為軟件開發所用到的工具和技術是在不斷更新的。而且,一個人也不可能了解軟件開發的所有過程。在日常生活中你每天接觸到的新鮮事物可能不會太多。但是對于從事軟件開發的人來說,每天可以學習很多新東西(如果愿意的話)。 

            4. 需求就是需求 

            如果你沒有任何需求,你就不要動手開發任何軟件。成功的軟件取決于時間(在用戶要求的時間內完成)、預算和是否滿足用戶的需求。如果你不能確切知道用戶需要的是什么,或者軟件的需求定義,那么你的工程注定會失敗。 

            5. 需求其實很少改變,改變的是你對需求的理解 

            Object ToolSmiths公司(www.objecttoolsmiths.com)的Doug Smith常喜歡說:“分析是一門科學,設計是一門藝術”。他的意思是說在眾多的“正確”分析模型中只存在一個最“正確”分析模型可以完全滿足解決某個具體問題的需要(我理解的意思是需求分析需要一絲不茍、精確的完成,而設計的時候反而可以發揮創造力和想象力 - 譯者注)。 

            如果需求經常改動,很可能是你沒有作好需求分析,并不是需求真的改變了。 

            你可以抱怨用戶不能告訴你他們想得到什么,但是不要忘記,收集需求信息是你工作。 

            你可以說是新來的開發人員把事情搞得一團糟,但是,你應該確定在工程的第一天就告訴他們應該做什么和怎樣去做。 

            如果你覺得公司不讓你與用戶充分接觸,那只能說明公司的管理層并不是真正支持你的項目。 

            你可以抱怨公司有關軟件工程的管理制度不合理,但你必須了解大多同行公司是怎么做的。 

            你可以借口說你們的競爭對手的成功是因為他們有了一個新的理念,但是為什么你沒先想到呢? 

            需求真正改變的情況很少,但是沒有做好需求分析工作的理由卻很多。 

            6. 經常閱讀 

            在這個每日都在發生變化的產業中,你不可能在已取得的成就上陶醉太久。 

            每個月至少讀2、3本專業雜志或者1本專業書籍。保持不落伍需要付出很多的時間和金錢,但會使你成為一個很有實力的競爭者。 

            7. 降低軟件模塊間的耦合度 

            高耦合度的系統是很難維護的。一處的修改引起另一處甚至更多處的變動。 

            你可以通過以下方法降低程序的耦合度:隱藏實現細節,強制構件接口定義,不使用公用數據結構,不讓應用程序直接操作數據庫(我的經驗法則是:當應用程序員在寫SQL代碼的時候,你的程序的耦合度就已經很高了)。 

            耦合度低的軟件可以很容易被重用、維護和擴充。 

            8. 提高軟件的內聚性 

            如果一個軟件的模塊只實現一個功能,那么該模塊具有高內聚性。高內聚性的軟件更容易維護和改進。 

            判斷一個模塊是否有高的內聚性,看一看你是否能夠用一個簡單的句子描述它的功能就行了。如果你用了一段話或者你需要使用類似“和”、“或”等連詞,則說明你需要將該模塊細化。 

            只有高內聚性的模塊才可能被重用。 

            9. 考慮軟件的移植性 

            移植是軟件開發中一項具體而又實際的工作,不要相信某些軟件工具的廣告宣傳(比如java 的宣傳口號write once run many ? 譯者注)。 

            即使僅僅對軟件進行常規升級,也要把這看得和向另一個操作系統或數據庫移植一樣重要。 

            記得從16位Windows移植到32位windows的“樂趣”嗎 ?當你使用了某個操作系統的特性,如它的進程間通信(IPC)策略,或用某數據庫專有語言寫了存儲過程。你的軟件和那個特定的產品結合度就已經很高了。 

            好的軟件設計者把那些特有的實現細節打包隱藏起來,所以,當那些特性該變的時候,你的僅僅需要更新那個包就可以了。 

            10. 接受變化 

            這是一句老話了:唯一不變的只有變化。 

            你應該將所有系統將可能發生的變化以及潛在需求記錄下來,以便將來能夠實現(參見“Architecting for Change”,Thinking Objectively, May 1999) 

            通過在建模期間考慮這些假設的情況,你就有可能開發出足夠強壯且容易維護的軟件。設計強壯的軟件是你最基本的目標。 

            11. 不要低估對軟件規模的需求 

            Internet 帶給我們的最大的教訓是你必須在軟件開發的最初階段就考慮軟件規模的可擴充性。 

            今天只有100人的部門使用的應用程序,明天可能會被有好幾萬人的組織使用,下月,通過因特網可能會有幾百萬人使用它。 

            在軟件設計的初期,根據在用例模型中定義的必須支持的基本事務處理,確定軟件的基本功能。然后,在建造系統的時候再逐步加入比較常用的功能。 

            在設計的開始考慮軟件的規模需求,避免在用戶群突然增大的情況下,重寫軟件。 

            12. 性能僅僅是很多設計因素之一 

            關注軟件設計中的一個重要因素--性能,這好象也是用戶最關心的事情。一個性能不佳的軟件將不可避免被重寫。 

            但是你的設計還必須具有可靠性,可用性,便攜性和可擴展性。你應該在工程開始就應該定義并區分好這些因素,以便在工作中恰當使用。性能可以是,也可以不是優先級最高的因素,我的觀點是,給每個設計因素應有的考慮。 

            13. 管理接口 

            “UML User Guide”(Grady Booch,Ivar Jacobson和Jim Rumbaugh ,Addison Wesley, 1999)中指出,你應該在開發階段的早期就定義軟件模塊之間的接口。 

            這有助于你的開發人員全面理解軟件的設計結構并取得一致意見,讓各模塊開發小組相對獨立的工作。一旦模塊的接口確定之后,模塊怎樣實現就不是很重要了。 

            從根本上說,如果你不能夠定義你的模塊“從外部看上去會是什么樣子”,你肯定也不清楚模塊內要實現什么。 

            14. 走近路需要更長的時間 

            在軟件開發中沒有捷徑可以走。 

            縮短你的在需求分析上花的時間,結果只能是開發出來的軟件不能滿足用戶的需求,必須被重寫。 

            在軟件建模上每節省一周,在將來的編碼階段可能會多花幾周時間,因為你在全面思考之前就動手寫程序。 

            你為了節省一天的測試時間而漏掉了一個bug,在將來的維護階段,可能需要花幾周甚至幾個月的時間去修復。與其如此,還不如重新安排一下項目計劃。 

            避免走捷徑,只做一次但要做對(do it once by doing it right)。 

            15. 別信賴任何人 

            產品和服務銷售公司不是你的朋友,你的大部分員工和高層管理人員也不是。 

            大部分產品供應商希望把你牢牢綁在他們的產品上,可能是操作系統,數據庫或者某個開發工具。 

            大部分的顧問和承包商只關心你的錢并不是你的工程(停止向他們付款,看一看他們會在周圍呆多長時間)。 

            大部分程序員認為他們自己比其他人更優秀,他們可能拋棄你設計的模型而用自己認為更好的。 

            只有良好的溝通才能解決這些問題。 

            要明確的是,不要只依靠一家產品或服務提供商,即使你的公司(或組織)已經在建模、文檔和過程等方面向那個公司投入了很多錢。 

            16. 證明你的設計在實踐中可行 

            在設計的時候應當先建立一個技術原型, 或者稱為“端到端”原型。以證明你的設計是能夠工作的。 

            你應該在開發工作的早期做這些事情,因為,如果軟件的設計方案是不可行的,在編碼實現階段無論采取什么措施都于事無補。技術原型將證明你的設計的可行性,從而,你的設計將更容易獲得支持。 

            17. 應用已知的模式 

            目前,我們有大量現成的分析和設計模式以及問題的解決方案可以使用。 

            一般來說,好的模型設計和開發人員,都會避免重新設計已經成熟的并被廣泛應用的東西。 
          http://www.ambysoft.com/processPatternsPage.html 收藏了許多開發模式的信息。 

            18. 研究每個模型的長處和弱點 

            目前有很多種類的模型可以使用,如下圖所示。用例捕獲的是系統行為需求,數據模型則描述支持一個系統運行所需要的數據構成。你可能會試圖在用例中加入實際數據描述,但是,這對開發者不是非常有用。同樣,數據模型對描述軟件需求來說是無用的。每個模型在你建模過程中有其相應的位置,但是,你需要明白在什么地方,什么時候使用它們。 

            19. 在現有任務中應用多個模型 

            當你收集需求的時候,考慮使用用例模型,用戶界面模型和領域級的類模型。 

            當你設計軟件的時候,應該考慮制作類模型,順序圖、狀態圖、協作圖和最終的軟件實際物理模型。 

            程序設計人員應該慢慢意識到,僅僅使用一個模型而實現的軟件要么不能夠很好地滿足用戶的需求,要么很難擴展。 

            20. 教育你的聽眾 

            你花了很大力氣建立一個很成熟的系統模型,而你的聽眾卻不能理解它們,甚至更糟-連為什么要先建立模型都不知道。那么你的工作是毫無意義的。 

            教給你開發人員基本的建模知識;否則,他們會只看看你畫的漂亮圖表,然后繼續編寫不規范的程序。 

            另外, 你還需要告訴你的用戶一些需求建模的基礎知識。給他們解釋你的用例(uses case)和用戶界面模型,以使他們能夠明白你要表達地東西。當每個人都能使用一個通用的設計語言的時候(比如UML-譯者注),你的團隊才能實現真正的合作。 

            21. 帶工具的傻瓜還是傻瓜 

            你給我CAD/CAM工具,請我設計一座橋。但是,如果那座橋建成的話,我肯定不想當第一個從橋上過的人,因為我對建筑一竅不通。 

            使用一個很優秀的CASE工具并不能使你成為一個建模專家,只能使你成為一個優秀CASE工具的使用者。成為一個優秀的建模專家需要多年的積累,不會是一周針對某個價值幾千美元工具的培訓。一個優秀的CASE工具是很重要,但你必須學習使用它,并能夠使用它設計它支持的模型。 

            22. 理解完整的過程 

            好的設計人員應該理解整個軟件過程,盡管他們可能不是精通全部實現細節。 

            軟件開發是一個很復雜的過程,還記得《object-oriented software process》第36頁的內容嗎?除了編程、建模、測試等你擅長工作外,還有很多工作要做。 

            好的設計者需要考慮全局。必須從長遠考慮如何使軟件滿足用戶需要,如何提供維護和技術支持等。 

            23. 常做測試,早做測試 

            如果測試對你的軟件來說是無所謂的,那么你的軟件多半也沒什么必要被開發出來。 

            建立一個技術原型供技術評審使用,以檢驗你的軟件模型。 

            在軟件生命周期中,越晚發現的錯誤越難修改,修改成本越昂貴。盡可能早的做測試是很值得的。 

            24. 把你的工作歸檔 

            不值得歸檔的工作往往也不值得做。歸檔你的設想,以及根據設想做出的決定;歸檔軟件模型中很重要但不很明顯的部分。 給每個模型一些概要描述以使別人很快明白模型所表達的內容。 

            25. 技術會變,基本原理不會 

            如果有人說“使用某種開發語言、某個工具或某某技術,我們就不需要再做需求分析,建模,編碼或測試”。不要相信,這只說明他還缺乏經驗。拋開技術和人的因素,實際上軟件開發的基本原理自20世紀70年代以來就沒有改變過。你必須還定義需求,建模,編碼,測試,配置,面對風險,發布產品,管理工作人員等等。 

            軟件建模技術是需要多年的實際工作才能完全掌握的。好在你可以從我的建議開始,完善你們自己的軟件開發經驗。 

            以雞湯開始,加入自己的蔬菜。然后,開始享受你自己的豐盛晚餐吧
          posted @ 2005-10-11 09:26 Michael 閱讀(158) | 評論 (0)編輯 收藏

          現在到eclipse網站可以下到中文包了!
              有兩個,分別是:NLpack1-eclipse-SDK-3.1.1a-win32.zip和NLpack1_FeatureOverlay-eclipse-SDK-3.1.1.zip。
              后者是前者的補充。
             
              在我的機子上,這兩個中文包只適合eclipse3.1.1版本,3.1版本都不適合,但網上有人說可以用,就不得而知了。eclipse3.1.1版本已經出了一段時日了,但一直都沒有使用過,今天是試用了一下,Lomboz還可以用,但de.strutsbox_20050804就不能用了。
              不過,裝上lomboz,NLpack1_FeatureOverlay-eclipse-SDK-3.1.1.zip就不怎么起作用了。

              myeclipseME-4.0GA_E3.1ManualInstall版在這個版本下面也不能使用。

              eclipse3.1.1在功能上與3.1版沒什么區別,但對插件兼容就不敢恭維了。

              eclipse3.1.1.jpg
          posted @ 2005-10-11 09:15 Michael 閱讀(1277) | 評論 (0)編輯 收藏

          開放源代碼協會通過Linux軟件開發公司Ximian開始了一個旨在將微軟.Net平臺移植到Linux上來的項目。這個叫做Mono工程的項目包括創建一個開發平臺允許人們為基于Linux和基于Windows系統的.Net開發應用程序。據Ximian公司的首席技術官員Miguel de Icaza說Mono項目的起因是GNOME社團特別是Ximain公司對于一個改進的開發工具的需要。

          但是Mono項目的影響確是更加深遠的,因為這些開發工具是基于CLI(通用語言架構)和微軟提交給歐洲計算機制造協會(ECMA)的C#實現標準的。如果Mono能夠完成基于這些標準創建一套Linux開發工具集的目標的話,開發者將能夠編寫同時在Windows和Linux上運行的.Net程序,這些程序甚至還可能在其它非Windows的操作系統上運行,比方Unix。

          除了實際的開發過程,Mono項目的工具必須在開放源代碼社團的內部完成而不能違反微軟的知識產權專利--這實際上意味著開發者們必須基于標準重新構造這些工具而不能查看微軟的任何源代碼。

          Mono項目包括三個核心的部分:一個C#語言的編譯器,一個CLI和一個類庫。 CLI是包含了類加載器的虛擬機,實時的編譯器,和一個運行時環境的垃圾收集器。CLI這個組件將允許用C#編寫的應用程序能夠在象Linux這樣的非Windows操作系統上運行。這與Java世界中Java虛擬機能夠讓一個應用程序在不同的操作系統上運行是類似的。

          Mono項目的類庫能夠讓應用程序完成核心的諸如XML處理,文件輸入輸出,和連接網絡之類的任務。它將會和微軟的CLI兼容(與微軟在.Net framework中發布的東西緊密的配套),還有一點就是將由開放源代碼團體編寫的額外的類庫也將和CLI兼容。

          Ximian公司的de Icaza希望在年底到達項目的一個里程碑,這時編譯器將能夠編譯類庫了。圖形用戶界面組件--創建GUI程序所需的類庫--將在明年中完成。

          “我們在這個方面工作的原因是希望升級我們的開發平臺來創建我們的Evolution桌面應用程序,”de Icazo說。Evolution是Ximian公司的電子郵件客戶端及個人和工作組信息管理程序。“當我們看見.Net framework的時候,我們覺得這些就是我們將用來開發我們下一代產品要使用的工具,”他說。

          Ximian并不將Mono和它自己看作是給Linux開發者一種途徑在可用的開發工具方面趕上Windows。其實,Linux開發者將更喜歡用他們目前使用的工具來編寫的編譯應用程序。Ximian 將另一個開放源代碼項目,SharpDevelop看作是用來提供與微軟Visual Studio .Net類似的集成開發環境的一種途徑。

          通過以開放源代碼的方式開發Mono,這個項目包含了許多對開發過程擁有廣泛興趣的人們。雖然Ximian可能希望找一些改進的開發工具來加速它的應用程序的開發過程,但其它的開發者可能是希望找到能夠讓他們在Windows上編寫程序然后在Linux系統上運行它們的開發工具。

          其中的一個大問題是如何避免微軟的知識產權保護。“我們避免知識產權保護的方法是堅持非研究性的主題并使用現有的技術實現其功能,”de Icaza說。例如,Mono JIT編譯器沒有使用任何先進的JIT編譯器技術。相反Mono的版本是基于老的JIT技術的。

          De Icaza還聲稱Mono必須“著眼大處”還不僅僅是去年ECMA規定了些什么。也就是說,Ximian計劃參與標準的制定過程并創建類庫來提高.Net framework的薄弱之處,比方說電子郵件管理。

          據Giga Information Group的副分析師Stacey Quandt稱,微軟不太可能支持Mono因為其授權是與GNU 通用公眾證書為C#的授權和GNU 弱公眾證書為類庫和運行庫的授權聯系在一起的。

          但即使微軟不支持Mono,Mono的存在也證實了微軟對于.Net能夠移植到其它平臺的聲明是正確的。

          Quandt說面向更廣泛的開發團體是Mono面臨的另一個挑戰。例如IBM和Sun都在Java上花費了巨額的投資,自然也就很難容忍競爭行為。
          posted @ 2005-10-11 08:46 Michael 閱讀(196) | 評論 (0)編輯 收藏

          結合 JavaBean 和 JDBC,我們可以編寫出結構清晰,使用方便的數據庫應用程序。

          db 類封裝了數據庫操作,包括建立和關閉連接,以及執行SQL查詢操作。
          emp類使用db類并針對EMP 表完成了根據工號查詢員工資料的功能,并提供了員工姓名的getter方法。

          package db;

          import java.net.*;
          import java.sql.*;
          import java.io.*;


          public class db {
           Connection conn;
           Statement stmt;
           ResultSet rs;
           
           //數據庫連接
           public void getConnection(){
            try{
             Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
             conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=Hotel;User=sa;Password=sa");
            }
            catch (Exception e){
             System.out.println(e.getMessage());
             }
            }
           
           //關閉連接
           public void closeConnection(){
            try{
             if (conn != null){
              conn.close();
             }
            }
            catch(Exception e){
             System.out.println(e.getMessage());
            }
           }
           
           //對數據庫進行操作
           public ResultSet executeQuery(String sql){
            rs = null;
            try{
             getConnection();
             if (conn != null){
              stmt = conn.createStatement();
              rs = stmt.executeQuery(sql);
             }
            }
            catch (Exception e){
             System.out.println(e.getMessage());
            }
            return rs;
           }

          }

          package db;

          import java.sql.*;


          public class emp extends db {
           private String empno;
           private String ename;
           
           public emp(String em){
            empno = em;
           }
           
           //執行Sql語句 對屬性ename賦值
           public void query(){
            try{
             String sSql = "select * from emp where empno =" + empno;
             ResultSet rs = executeQuery(sSql);
             if (rs.next()){
              ename = rs.getString("ename");
             }
             
            }
            catch (Exception e){
             System.out.println(e.getMessage());
            }
           }
           
           //得到ename
           public String getEname(){
            return ename;
           }

          }


          package db;

          import java.io.*;
          import java.sql.*;


          public class TestBean {
           public static void main(String args[]){
            String empno;
            emp em;
            
            try{
             System.out.println("請輸入工號:");
             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
             empno = br.readLine();
             em = new em(empno);
             em.query();
             System.out.println("工號為" + empno + "的員工姓名是:" + em.getEname());
             em.closeConnection();
             
            }
            catch (Exception e){
             System.out.println(e.getMessage());
            }
            
           }

          }


          posted @ 2005-10-08 21:28 Michael 閱讀(397) | 評論 (0)編輯 收藏

          Java數據庫連接(JDBC)API是一系列能夠讓Java編程人員訪問數據庫的接口,各個開發商的接口并不完全相同。在使用多年的Oracle公司的JDBC后,我積累了許多技巧,這些技巧能夠使我們更好地發揮系統的性能和實現更多的功能。

            1、在客戶端軟件開發中使用Thin驅動程序

            在開發Java軟件方面,Oracle的數據庫提供了四種類型的驅動程序,二種用于應用軟件、applets、servlets等客戶端軟件,另外二種用于數據庫中的Java存儲過程等服務器端軟件。在客戶機端軟件的開發中,我們可以選擇OCI驅動程序或Thin驅動程序。OCI驅動程序利用Java本地化接口(JNI),通過Oracle客戶端軟件與數據庫進行通訊。Thin驅動程序是純Java驅動程序,它直接與數據庫進行通訊。為了獲得最高的性能,Oracle建議在客戶端軟件的開發中使用OCI驅動程序,這似乎是正確的。但我建議使用Thin驅動程序,因為通過多次測試發現,在通常情況下,Thin驅動程序的性能都超過了OCI驅動程序。

            2、關閉自動提交功能,提高系統性能

            在第一次建立與數據庫的連接時,在缺省情況下,連接是在自動提交模式下的。為了獲得更好的性能,可以通過調用帶布爾值false參數的Connection類的setAutoCommit()方法關閉自動提交功能,如下所示:

            conn.setAutoCommit(false);

            值得注意的是,一旦關閉了自動提交功能,我們就需要通過調用Connection類的commit()和rollback()方法來人工的方式對事務進行管理。

            3、在動態SQL或有時間限制的命令中使用Statement對象

            在執行SQL命令時,我們有二種選擇:可以使用PreparedStatement對象,也可以使用Statement對象。無論多少次地使用同一個SQL命令,PreparedStatement都只對它解析和編譯一次。當使用Statement對象時,每次執行一個SQL命令時,都會對它進行解析和編譯。這可能會使你認為,使用PreparedStatement對象比使用Statement對象的速度更快。然而,我進行的測試表明,在客戶端軟件中,情況并非如此。因此,在有時間限制的SQL操作中,除非成批地處理SQL命令,我們應當考慮使用Statement對象。

            此外,使用Statement對象也使得編寫動態SQL命令更加簡單,因為我們可以將字符串連接在一起,建立一個有效的SQL命令。因此,我認為,Statement對象可以使動態SQL命令的創建和執行變得更加簡單。

            4、利用helper函數對動態SQL命令進行格式化

            在創建使用Statement對象執行的動態SQL命令時,我們需要處理一些格式化方面的問題。例如,如果我們想創建一個將名字O'Reilly插入表中的SQL命令,則必須使用二個相連的“''”號替換O'Reilly中的“'”號。完成這些工作的最好的方法是創建一個完成替換操作的helper方法,然后在連接字符串心服用公式表達一個SQL命令時,使用創建的helper方法。與此類似的是,我們可以讓helper方法接受一個Date型的值,然后讓它輸出基于Oracle的to_date()函數的字符串表達式。

            5、利用PreparedStatement對象提高數據庫的總體效率

            在使用PreparedStatement對象執行SQL命令時,命令被數據庫進行解析和編譯,然后被放到命令緩沖區。然后,每當執行同一個PreparedStatement對象時,它就會被再解析一次,但不會被再次編譯。在緩沖區中可以發現預編譯的命令,并且可以重新使用。在有大量用戶的企業級應用軟件中,經常會重復執行相同的SQL命令,使用PreparedStatement對象帶來的編譯次數的減少能夠提高數據庫的總體性能。如果不是在客戶端創建、預備、執行PreparedStatement任務需要的時間長于Statement任務,我會建議在除動態SQL命令之外的所有情況下使用PreparedStatement對象。

            6、在成批處理重復的插入或更新操作中使用PreparedStatement對象

            如果成批地處理插入和更新操作,就能夠顯著地減少它們所需要的時間。Oracle提供的Statement和 CallableStatement并不真正地支持批處理,只有PreparedStatement對象才真正地支持批處理。我們可以使用addBatch()和executeBatch()方法選擇標準的JDBC批處理,或者通過利用PreparedStatement對象的setExecuteBatch()方法和標準的executeUpdate()方法選擇速度更快的Oracle專有的方法。要使用Oracle專有的批處理機制,可以以如下所示的方式調用setExecuteBatch():
          PreparedStatement pstmt3D null;
          try {
          ((OraclePreparedStatement)
          pstmt).setExecuteBatch(30);
          ...
          pstmt.executeUpdate();
          }


            調用setExecuteBatch()時指定的值是一個上限,當達到該值時,就會自動地引發SQL命令執行,標準的executeUpdate()方法就會被作為批處理送到數據庫中。我們可以通過調用PreparedStatement類的sendBatch()方法隨時傳輸批處理任務。

            7、使用Oracle locator方法插入、更新大對象(LOB)

            Oracle的PreparedStatement類不完全支持BLOB和CLOB等大對象的處理,尤其是Thin驅動程序不支持利用PreparedStatement對象的setObject()和setBinaryStream()方法設置BLOB的值,也不支持利用setCharacterStream()方法設置CLOB的值。只有locator本身中的方法才能夠從數據庫中獲取LOB類型的值。可以使用PreparedStatement對象插入或更新LOB,但需要使用locator才能獲取LOB的值。由于存在這二個問題,因此,我建議使用locator的方法來插入、更新或獲取LOB的值。

            8、使用SQL92語法調用存儲過程

            在調用存儲過程時,我們可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并沒有什么實際的好處,而且會給以后維護你的應用程序的開發人員帶來麻煩,因此,我建議在調用存儲過程時使用SQL92。

            9、使用Object SQL將對象模式轉移到數據庫中

            既然可以將Oracle的數據庫作為一種面向對象的數據庫來使用,就可以考慮將應用程序中的面向對象模式轉到數據庫中。目前的方法是創建Java bean作為偽裝的數據庫對象,將它們的屬性映射到關系表中,然后在這些bean中添加方法。盡管這樣作在Java中沒有什么問題,但由于操作都是在數據庫之外進行的,因此其他訪問數據庫的應用軟件無法利用對象模式。如果利用Oracle的面向對象的技術,可以通過創建一個新的數據庫對象類型在數據庫中模仿其數據和操作,然后使用JPublisher等工具生成自己的Java bean類。如果使用這種方式,不但Java應用程序可以使用應用軟件的對象模式,其他需要共享你的應用中的數據和操作的應用軟件也可以使用應用軟件中的對象模式。

            10、利用SQL完成數據庫內的操作

            我要向大家介紹的最重要的經驗是充分利用SQL的面向集合的方法來解決數據庫處理需求,而不是使用Java等過程化的編程語言。

            如果編程人員要在一個表中查找許多行,結果中的每個行都會查找其他表中的數據,最后,編程人員創建了獨立的UPDATE命令來成批地更新第一個表中的數據。與此類似的任務可以通過在set子句中使用多列子查詢而在一個UPDATE命令中完成。當能夠在單一的SQL命令中完成任務,何必要讓數據在網上流來流去的?我建議用戶認真學習如何最大限度地發揮SQL的功能。
          posted @ 2005-10-08 18:25 Michael 閱讀(209) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 科尔| 汉中市| 无极县| 四会市| 日土县| 宝丰县| 汝州市| 法库县| 来凤县| 白水县| 牡丹江市| 安陆市| 泸定县| 尼木县| 镇安县| 泽普县| 库伦旗| 保德县| 沾化县| 东阳市| 二连浩特市| 雷州市| 樟树市| 乳山市| 泗洪县| 康保县| 古浪县| 宜君县| 云梦县| 长海县| 平武县| 宁城县| 山阳县| 贵溪市| 奎屯市| 通辽市| 平原县| 绥宁县| 炉霍县| 临西县| 五莲县|