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

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

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

    隨筆-23  評論-6  文章-1  trackbacks-0
      2005年9月15日

    sourceforge http://www.sourceforge.net
    java.net http://www.java.net

    www.eclipse.org

    www.opensource.org

    Lomboz http://www.objectlearn.com/index.jsp (J2EE plugin for Eclipse)
    htmlArea http://sourceforge.net/projects/itools-htmlarea/ (所見即所得的在線HTML編輯器)
    XmlBuddy http://www.xmlbuddy.com/ (XML Editor plugin for Eclipse)
    JFreeChart http://www.jfree.org/ (用于生成圖表的項目)
    EclipseME http://eclipseme.sourceforge.net/ (J2ME Developmnt Plugin for Eclipse)
    mvnForum http://sourceforge.net/projects/mvnforum/ (論壇)
    jChatBox http://www.javazoom.net/index.shtml (用servlet實現的WEB聊天引擎)
    POI http://jakarta.apache.org/poi/index.html (用于處理Excel,WORD等文檔的項目)
    FileUpload http://jakarta.apache.org/commons/fileupload/ (用于處理HTTP文件上傳得項目)
    PDFBox http://sourceforge.net/projects/pdfbox/ (處理PDF文檔的項目)
    Lucene http://jakarta.apache.org/lucene/index.html (搜索引擎)
    Digester http://jakarta.apache.org/commons/digester/ (處理XML信息的項目)
    DBCP http://jakarta.apache.org/commons/dbcp/ (數據庫連接池)
    AXIS http://ws.apache.org/axis/ (WebService 的實現框架)
    Jetspeed http://portals.apache.org/jetspeed-1/ (Portal)
    HSQLDB http://sourceforge.net/projects/hsqldb/ (Im memory Database Engine)
    CEWOLF http://sourceforge.net/projects/cewolf/ (一套標簽庫實現Web報表,使用的是jFreeChart引擎)
    Struts Menu http://sourceforge.net/projects/struts-menu/ (基于Struts的Web菜單項目)
    htmlparser http://sourceforge.net/projects/htmlparser/ (用于解析HTML信息的項目)
    Mondrian http://sourceforge.net/projects/mondrian/(Open Source OLAP Database)
    ProGuard http://sourceforge.net/projects/proguard/(Java的混淆器)
    InfoGlue http://sourceforge.net/projects/infoglue/ (J2EE 內容管理系統)
    JPivot http://sourceforge.net/projects/jpivot/ (基于WEB的OLAP 展現)
    http://java-source.net/

    http://www.javaalmanac.com - Java開發者年鑒一書的在線版本. 要想快速查到某種Java技巧的用法及示例代碼, 這是一個不錯的去處.
    http://www.onjava.com - O'Reilly的Java網站. 每周都有新文章.
    http://java.sun.com - 官方的Java開發者網站 - 每周都有新文章發表.
    http://www.developer.com/java - 由Gamelan.com 維護的Java技術文章網站.
    http://www.java.net - Sun公司維護的一個Java社區網站.
    http://www.builder.com - Cnet的Builder.com網站 - 所有的技術文章, 以Java為主.
    http://www.ibm.com/developerworks/java - IBM的Developerworks技術網站; 這是其中的Java技術主頁.
    http://www.javaworld.com - 最早的一個Java站點. 每周更新Java技術文章.
    http://www.devx.com/java - DevX維護的一個Java技術文章網站.
    http://www.fawcette.com/javapro - JavaPro在線雜志網站.
    http://www.sys-con.com/java - Java Developers Journal的在線雜志網站.
    http://www.javadesktop.org - 位于Java.net的一個Java桌面技術社區網站.
    http://www.theserverside.com - 這是一個討論所有Java服務器端技術的網站.
    http://www.jars.com - 提供Java評論服務. 包括各種framework和應用程序.
    http://www.jguru.com - 一個非常棒的采用Q&A形式的Java技術資源社區.
    http://www.javaranch.com - 一個論壇,得到Java問題答案的地方,初學者的好去處。
    http://www.ibiblio.org/javafaq/javafaq.html - comp.lang.java的FAQ站點 - 收集了來自comp.lang.java新聞組的問題和答案的分類目錄.
    http://java.sun.com/docs/books/tutorial/ - 來自SUN公司的官方Java指南 - 對于了解幾乎所有的java技術特性非常有幫助.
    http://www.javablogs.com - 互聯網上最活躍的一個Java Blog網站.
    http://java.about.com/ - 來自About.com的Java新聞和技術文章網站
    HttpClient http://jakarta.apache.org/commons/httpclient/ 處理http客戶端的接口

    原文地址
    http://blog.csdn.net/Xviewee/archive/2007/12/17/1944374.aspx
    posted @ 2011-05-05 15:31 ceaboat 閱讀(1123) | 評論 (0)編輯 收藏
     

    演示視頻請點擊

    1.   概述

    高效率開發、易用、功能穩定、執行效率高、維護成本低、需求變更是軟件開發遵循的守則,然而現實中我們面臨各種各樣的問題:

    1.     程序員A,程序員B開發同樣的功能,理解不同、開發用時、及開發質量良莠不齊,延遲交付時間普遍。相反監督者需要花費更多精力與時間可以彌補,加大投入成本。

    2.     后期維護成本高,如由于測試跟不上BUG檢測不到、需求變更等。

    3.     同行競爭的壓力,如A公司開發模塊實際時間10工作日、B公司開發模塊實際時間15工作日,競標會處于劣勢。

    4.     隨著公司業務擴展,項目繁多,招攬人員越多、管理難度越大等因素日漸凸顯,造成企業發展的瓶頸。

    5.     人員的培養需要大量成本,與人員的不穩定性因素對企業造成損失較大,如人員請假、離職等。

    6.     開發測試—QA—用戶測試試運營運營,是軟件開發中耗費成本巨大的一個循環過程鏈,制約企業發展。

    上述是據個人經驗總結,Db2view是針對上述問題的一個解決方案。

    2.   Db2view架構

    Db2view是以高效、穩定、易用、低成本維護為目的所研制的一套輕量級非入侵式、自動化開發平臺。兼容多種架構,如SSHstruts—spring—ibatis等容易集成到系統,根據多年的行業經驗,高效的針對各行業業務特點,最大化減少建設與維護成本。目前已在多個項目實施,不斷完善。
    2.1          Db2view總體架構圖

               
        

                2.2          平臺說明

            2.2.1              db2view核心層

    Db2view:根據編寫的SQL,在所有元素據中,勾選需要顯示的元素據列,即可生成自定義顯示列表。

    如select school_id,school_name,school_code, school_manager from school

    然后在配置界面勾選school_name, school_manager字段,則顯示的列表為:

    school_name

    school_manager

    廣東廣雅中學

    黃光裕

    廣州先烈東小學

    王興東

    查詢:在SQL里涉及并且勾選的元素據字段中,可以選擇是否作為查詢的字段,勾選后該列成為查詢項,如果是時間字段還可以進行時間區間查詢的選擇。

    排序:列表中的每個字段都可以進行升序與降序的排列功能。

    自定義字段名:對每個列名稱進行界面配置,如勾選school_name、school_manager字段,可以對school_name定義顯示列名為:學校名稱、school_manager顯示列名為:學校管理員,修改后列表顯示如下:

    學校名稱

    學校管理員

    廣東廣雅中學

    黃光裕

    廣州先烈東小學

    王興東

    轉義詞:數據庫中記錄男女使用0,1表示,而界面需要顯示為男女文字的信息,使用轉義詞可以達到效果。

    刪除:界面化配置是否需要刪除功能,刪除指定字段的表記錄。

              2.2.2              擴展層

    操作:所有列表均可以添加外部操作(如增加、批量刪除)與行內操作(編輯、刪除),由此構成一個完整的業務功能。(示例見演示視頻)

     

    數據導出:界面化配置是否需要excel數據導出功能,根據查詢的條件顯示的數據,可選擇導出當前所見數據與所有滿足條件的數據兩個選擇。

     

    模板定制:界面化配置模板,方便為不同的客戶需求定制不同的顯示模板。

     

    換膚:界面化配置皮膚,每個模板依據規范可以有不同的皮膚更換功能。

     

    數據安全:加入訪問權限控制規則,保障功能數據安全性。(待實現)

       3.   平臺優缺點

      

      3.1          優點
    (1)
    高效率開發:db2view平臺開發工具采用全界面配置,編寫業務SQL,簡單配置,即可完成。列表功能開發以分鐘計時,15分鐘可以完成一個高質量列表的功能開發。

        (2)易用性:界面編寫SQL,然后配置即可得到一個界面友好,高質量的功能列表。將傳統程序員需要熟悉各種復雜的技術框架解放出來,專注于業務邏輯,大大降低企業由于人員離職或其他情況所帶來的損失。

        (3)功能穩定:所有功能使用統一內核,經過多個項目的迭代驗證其穩定性、可靠性。

        (4)低成本維護:   所有的功能需要維護的只有業務SQL與配置文件,最大化的減少維護的成本。

    比較現今流行的SSH架構開發流程:

    維護成本是流程涉及的內容,成本花費高。

    Db2view開發流程:

    維護成本只有業務SQL與配置文件,易于維護。

        (5)快速響應需求變更:如業務更改字段名、添加或刪除顯示字段、

    添加查詢字段、功能刪除等維護工作都能夠在極短的時間內響應。
     

        (6)無需重啟服務器:功能的生成與修改實時生效,無需重啟服務器。

     


    3.2          缺點
    (1)   
    平臺仍需完善,暫不能夠滿足所有業務需求界面化

           (2)    平臺操作友好性仍待提高,如轉義詞的添加、新添加配置等

        4.   平臺支撐環境

    數據庫:ORACLE 10G以上版本

    語言:JAVA

    JDK版本:1.4以上

    服務器:Tomcat,JBoss,Resin,WebSphere,WebLogic等主流服務器。

        5.   部署

    根據開發模式分為兩種部署方式。

    面向服務式模式:

    作為分布式服務器對外提供服務,生成功能鏈接嵌入應用系統。該模式的優點:

    1.    對應用系統完全無入侵,100%輕量級開發。

    2.    產品升級調試簡單。

    缺點:

    1.    需要開放應用的數據庫訪問權限。

    2.    涉及操作并有關聯動作:如刪除功能在A系統開發,B系統是Db2view,關聯頁面需要設置同域方能進行交互。

    3.    安全性相對另一種模式低。

     

       組件模式:

    作為組件集成到開發項目中,容易管理,安全性也高。

    優點:

    安全性高,可根據開發系統的權限要求做安全性控制

        缺點:

    升級調試相對復雜。

    5分鐘生成功能例子,對此工具有興趣者請加群:12990321.

    posted @ 2010-04-01 17:47 ceaboat 閱讀(1419) | 評論 (0)編輯 收藏
    #1 ?世界上最經典的25句話

    1.記住該記住的,忘記該忘記的。改變能改變的,接受不能改變的。

    2.能沖刷一切的除了眼淚,就是時間,以時間來推移感情,時間越長,沖突越 淡,仿佛不斷稀釋的茶。

    3.怨言是上天得至人類最大的供物,也是人類禱告中最真誠的部分。

    4.智慧的代價是矛盾。這是人生對人生觀開的玩笑。

    5.世上的姑娘總以為自己是驕傲的公主(除了少數極丑和少數極聰明的姑娘例外)。

    6.如果敵人讓你生氣,那說明你還沒有勝他的把握。

    7.如果朋友讓你生氣,那說明你仍然在意他的友情。

    8.令狐沖說“有些事情本身我們無法控制,只好控制自己。”

    9.我不知道我現在做的哪些是對的,那些是錯的,而當我終于老死的時候我才知道這些。所以我現在所能做的就是盡力做好待著老死。

    10.也許有些人很可惡,有些人很卑鄙。而當我設身為他想象的時候,我才知道:他比我還可憐。所以請原諒所有你見過的人,好人或者壞人。

    11.魚對水說你看不到我的眼淚,因為我在水里.水說我能感覺到你的眼淚,因為你在我心里。

    12.快樂要有悲傷作陪,雨過應該就有天晴。如果雨后還是雨,如果憂傷之后還是憂傷.請讓我們從容面對這離別之后的離別。微笑地去尋找一個不可能出現的你!

    13.死亡教會人一切,如同考試之后公布的結果——雖然恍然大悟,但為時晚矣~!

    14.你出生的時候,你哭著,周圍的人笑著;你逝去的時候,你笑著,而周圍的人在哭!一切都是輪回!!!! 我們都在輪回中!!!!

    15.男人在結婚前覺得適合自己的女人很少,結婚后覺得適合自己的女人很多。

    16.于千萬人之中,遇見你所遇見的人;于千萬年之中,時間的無涯荒野里,沒有早一步,也沒有晚一步,剛巧趕上了 。

    17.每個人都有潛在的能量,只是很容易:被習慣所掩蓋,被時間所迷離,被惰性所消磨。

    18.人生短短幾十年,不要給自己留下了什么遺憾,想笑就笑,想哭就哭,該愛的時候就去愛,無謂壓抑自己。

    19.《和平年代》里的話:當幻想和現實面對時,總是很痛苦的。要么你被痛苦擊倒,要么你把痛苦踩在腳下。

    20.真正的愛情是不講究熱鬧不講究排場不講究繁華更不講究嚎頭的。

    21.生命中,不斷地有人離開或進入。于是,看見的,看不見的;記住的,遺忘了。生命中,不斷地有得到和失落。于是,看不見的,看見了;遺忘的,記住了。然而,看不見的,是不是就等于不存在?記住的,是不是永遠不會消失?

    22.我們確實活得艱難,一要承受種種外部的壓力,更要面對自己內心的困惑。在苦苦掙扎中,如果有人向你投以理解的目光,你會感到一種生命的暖意,或許僅有短暫的一瞥,就足以使我感奮不已。

    23.我不去想是否能夠成功,既然選擇了遠方,便只顧風雨兼程;我不去想,身后會不會襲來寒風冷雨,既然目標是地平線,留給世界的只能是背影。

    24.后悔是一種耗費精神的情緒.后悔是比損失更大的損失,比錯誤更大的錯誤.所以不要后悔 。

    25.日出東海落西山,愁也一天,喜也一天;遇事不鉆牛角尖,人也舒坦,心也舒坦。
    posted @ 2006-12-05 11:31 ceaboat 閱讀(241) | 評論 (0)編輯 收藏

    現象一:
             錯誤信息:
                     java.lang.SecurityException: sealing violation: can't seal package oracle.jdbc.driver: already loaded
             原因:
                     was啟動的lib里存在多個ORACLE DRIVER。
             解決:
                     保留最新的一個驅動包解決。
             遺留問題:
                     開發環境使用TOMCAT發布無此問題,JBUILDER2006開發中包是有優先順序的,即使存在多個
             相同的類,優先選擇第一個找到的類。WAS在這方面顯然存在不足,排異容錯性不夠強大。
    現象二:
            錯誤信息:
                   
    Error 500: LinkageError while defining class: com.gzedu.eecn.structure.login.action.UserLoginAction Could not be defined due to: com/gzedu/eecn/structure/login/action/UserLoginAction (Illegal constant pool type) This is often caused by having a class defined at multiple locations within the classloader hierarchy. Other potential causes include compiling against an older or newer version of the class that has an incompatible method signature. Dumping the current context classloader
          
    原因:
                     上傳的文件已經損壞。重復試過很多次,發現本機器通過SSH上傳過程中文件已經損壞。
             屬于本機問題。
            解決:
                   通過同事的機器上傳文件解決
            總結:
                    類似此問題出現的幾率很小,可以認為是相同的環境,使用相同的方式做一件事情也有可能出現
           不同的效果。再次出現類似問題可以更快的定位錯誤點。
    現象三:
            錯誤信息:
                      com.ibm.ws.jsp.translator.JspTranslationException: JSPG0227E: 轉換 /login.jsp: 
    /login.jsp(1,1) --> JSPG0145E: 未知 JSP 元素:jsp:directive.pagelanguage
             原因:
                      windows環境、tomcat作為服務器開發,部署到sit、unix環境,會出現頁面不同的開發環境會
             有中文問題,或是說重復定義encoding的問題頁面編碼問題。
             解決:
                按照如下進行修改和配置;
                         
    1. 對于不是被include的頁面必須使用;
                   <%@ page contentType="text/html;charset=GBK" pageEncoding="GBK" language="java" %>
                   。 大寫GBK
                         2. 對于被Include的頁面必須使用如下;
                   。<%@ page pageEncoding="GBK" language="java" %>
                 注:在TOMCAT4.1.30-->was5.0,6.0出現此問題
            

    posted @ 2006-01-25 15:09 ceaboat 閱讀(2065) | 評論 (0)編輯 收藏
    sun.jdbc.rowset.CachedRowSet是sun提供的緩存數據集的一個類(數據集持久化),對BLOG,CLOG不能支持,LOG的容量是4G,結果集里存在LOG字段緩存時會報java.lang.NumberFormatException: For input string: "4294967295"
    據說sun對LOG的支持原來是2G,不曉得是否有支持4G的類。

    對于原來使用的com.sun.rowset.CachedRowSetImpl深感疑惑此類在緩存number字段的時候如果SCALE沒聲明會報不能小于0的異常
    posted @ 2005-12-09 09:57 ceaboat 閱讀(856) | 評論 (0)編輯 收藏
    1.GB2312支持拼音排序,GBK、GB18030不支持。2005年11月23日15:31:42
    2.websphere5與6的區別:5對路徑不需要/,而6必須要/,否則因為少了/找不到相應的配置文件
    posted @ 2005-11-23 15:31 ceaboat 閱讀(346) | 評論 (0)編輯 收藏

    參與一個項目要做到:
    1.項目中有你參與整個項目進展會順利的多。體現你的重要性。
    2.一個人的能力再強,精力是有限的。切記不可體現個人主義,充分發揮團隊能力,協調、配合往往比
       技術重要性排前一個位置。
    3.主動承擔一些責任,對團隊可提高士氣融合的氣氛、對個人當成一個磨練的機會。
    4.注意項目中遇到的一些細小的問題。最不起眼的就是最能考驗個人細心的程度,自己負責的事情要做到
       最好。
    5.同一件事情不同的人處理效果不同。

    posted @ 2005-11-10 00:21 ceaboat 閱讀(440) | 評論 (0)編輯 收藏
    通過URL來訪問網站,action里request.getMothod()得到的GET.
    而通過FORM來提交的則可以設置POST,可以通過這兩種方
    式的差異來做一些第一次訪問與之后訪問的一些個性化設置。
    posted @ 2005-11-09 20:17 ceaboat 閱讀(368) | 評論 (0)編輯 收藏

    增加翻頁接口,滿足各種分頁不同的界面化顯示。
    代碼已經開發完,工具需要做小量修改,進期主要任務是編寫使用手冊。
    2005年10月16日21:43:36

    posted @ 2005-10-16 21:43 ceaboat 閱讀(357) | 評論 (0)編輯 收藏
    10.1到珠海過關的時候檢查邊防證,偶可是沒那小本本,邊警上來搜查,抓了4個人下去補辦。(很多人都是沒辦的)看來穿著整齊是有點效果,人品好麻煩自然少
    posted @ 2005-10-03 21:50 ceaboat 閱讀(424) | 評論 (0)編輯 收藏

    打算到上海浙江一帶去放松,解決工作上的壓力。現在是去不成了,國慶4天假,廣州不是放松的好地方。白云山還算可以一去,只好改去珠海玩兩天,吃點海鮮補償補償了

    posted @ 2005-10-01 12:59 ceaboat 閱讀(417) | 評論 (0)編輯 收藏
    WASD支持熱啟動,修改代碼保存服務器進行實時更新,CachedRowSet crs = new CachedRowSetImpl();緩存數據集出異常。服務器熱啟動與緩存機制之間有沖突。
    posted @ 2005-10-01 12:54 ceaboat 閱讀(436) | 評論 (0)編輯 收藏

    ??????????????????????????????????????????????????????????測試源代碼

    CapabilityForConnection?主運行程序,讀取配置文件init.properties、reference.properties初始化參數。調用POOLTEST(一次完整的測試用例),計算其平均時間與使用連接數

    package?com.cea.repository.test;

    import
    ?org.apache.commons.logging.LogFactory;
    import
    ?org.apache.commons.logging.Log;
    import
    ?java.util.Properties;
    import
    ?java.io.FileInputStream;
    import
    ?java.io.InputStream;

    public?class
    ?CapabilityForConnection?{
    ????
    private?static?Log?log?=?LogFactory.getLog(CapabilityForConnection.class
    );
    ????
    /**

    ?????*?計算一次測試所消耗的時間
    ?????
    */
    ????
    public?static?long?times?=?0;
    ????
    /**

    ?????*?連接數
    ?????
    */
    ????
    public?static?long?psize?=?0;

    ????
    public?static?void?main(String[]?args)?throws
    ?Exception?{
    ????????
    /**

    ?????????*?運行的次數
    ?????????
    */
    ????????
    int?size?=?1;
    ????????
    /**

    ?????????*?見POOLTEST說明
    ?????????
    */
    ????????
    int?execsum?=?0;
    ????????
    /**

    ?????????*?見POOLTEST說明
    ?????????
    */
    ????????
    int?opencon?=?0;
    ????????
    /**

    ?????????*?execsum對應properties的命名
    ?????????
    */
    ????????String?execs?
    =?null;
    ????????
    /**

    ?????????*?opencon對應properties的命名
    ?????????
    */
    ????????String?openc?
    =?null;

    ????????
    long?sumtime?=?0
    ;
    ????????Properties?prop?
    =?initProperty("reference.properties"
    );
    ????????Properties?init?
    =?initProperty("init.properties"
    );

    ????????
    if?(init.size()?>?0
    )?{
    ????????????Object?o?
    =?init.get("init"
    );
    ????????????size?
    =
    ?Integer.parseInt(o.toString());
    ????????????execs?
    =?init.get("name0"
    ).toString();
    ????????????openc?
    =?init.get("name1"
    ).toString();
    ????????}

    ????????
    for?(int?i?=?0;?i?<?prop.size()?/?2;?i++
    )?{
    ????????????execsum?
    =?Integer.parseInt(prop.getProperty(execs?+
    ?i).toString());
    ????????????opencon?
    =?Integer.parseInt(prop.getProperty(openc?+
    ?i).toString());
    ????????????sumtime?
    =?0
    ;
    ????????????psize?
    =?0
    ;
    ????????????log.info(
    ""?+?(i?+?1)?+?"組數據:"
    );
    ????????????log.info(
    "并發應用數:"?+?execsum?+?"?模擬連接數:"?+
    ?opencon);

    ????????????String[]?reference?
    =?{""?+?execsum,?""?+
    ?opencon};
    ????????????
    for?(int?j?=?0;?j?<?size;?j++
    )?{
    ????????????????times?
    =?0
    ;
    ????????????????PoolTest.main(reference);
    ????????????????sumtime?
    +=
    ?times;
    ????????????}
    ????????????log.info(
    ""?+?(i?+?1)?+?"組數據共執行"?+?size?+?"次;平均耗時為:"?+

    ?????????????????????sumtime?
    /?(size?*?execsum)?+?"毫秒");
    ????????????log.info(
    "平均使用"?+?psize?/?size?+?"個連接"
    );

    ????????}
    ????}

    ????
    private?static?Properties?initProperty(String?filename)?throws
    ?Exception?{
    ????????InputStream?is?
    =?new
    ?FileInputStream(filename);
    ????????Properties?prop?
    =?new
    ?Properties();
    ????????prop.load(is);
    ????????
    return
    ?prop;

    ????}
    }

    POOLTEST計算一次完整過程耗時,統計消耗的連接
    package?com.cea.repository.test;

    import
    ?com.cea.repository.test.testdata.MainExecute;
    import
    ?java.util.HashMap;
    import
    ?java.util.Map;
    import
    ?com.cea.repository.connection.PoolSupper;
    import
    ?org.apache.commons.logging.LogFactory;
    import
    ?org.apache.commons.logging.Log;
    /**

    ?*
    ?*?

    Title:?連接池性能測試


    ?*
    ?*?

    Description:?測試不合理的利用連接對WEB應用所造成影響.


    ?*
    ?*?

    Copyright:?Copyright?(c)?2005


    ?*
    ?*?

    Company:?


    ?*
    ?*?
    @author?小舟
    ?*?
    @version
    ?1.0
    ?
    */

    public?class?PoolTest?extends?Thread?{
    ????
    private?static?Log?log?=?LogFactory.getLog(PoolTest.class
    );
    ????
    /**

    ?????*?并發執行MainExecute的數量
    ?????
    */
    ????
    private?static?int?EXECUTESUM?=?35;
    ????
    /**

    ?????*?一次MainExecute執行所請求的連接數
    ?????
    */
    ????
    public?static?int?CONNECTIONS?=?3;
    ????
    /**

    ?????*?記錄所使用的連接
    ?????
    */
    ????
    public?static?Map?poolTestMap?=?new?HashMap();
    ????
    /**

    ?????*?第sum次執行MainExecute所需要的時間
    ?????
    */
    ????
    public?int?sum?=?0;

    ????
    public?void
    ?run()?{
    ????????
    try
    ?{
    ????????????
    long?s?=
    ?System.currentTimeMillis();
    ????????????com.cea.repository.test.testdata.MainExecute.main(
    null
    );
    ????????????
    long?t?=?System.currentTimeMillis()?-
    ?s;
    ????????????CapabilityForConnection.times?
    +=
    t;
    //
    ????????????if(CapabilityForConnection.times?//????????????????CapabilityForConnection.times?=?t;
    //
    ????????????}

    //
    ????????????log.info("time"?+?(++sum)?+?":"?+
    //???????????????????????????????(System.currentTimeMillis()?-?s));

    ????????}?catch?(Exception?ex)?{
    ????????}
    ????}

    ????
    public?static?void?main(String[]?args)?throws
    ?Exception?{
    ????????
    if(args!=?null?&&?args.length>1
    ){
    ????????????EXECUTESUM?
    =?Integer.parseInt(args[0
    ]);
    ????????????CONNECTIONS?
    =?Integer.parseInt(args[1
    ]);
    ????????}

    ????????PoolSupper.initPool();
    ????????startExec(EXECUTESUM);
    ????????
    //設定足夠長的時間等待所有程序執行完,得到準確的并發執行所消耗的時間

    ????????try?{
    ????????????Thread.sleep(
    6000
    );
    ????????}?
    catch
    ?(InterruptedException?ex)?{
    ????????????ex.printStackTrace();
    ????????}
    ????????log.info(
    "運行平均耗時:"?+?CapabilityForConnection.times/
    EXECUTESUM);
    ????????
    //如果條件成立,證明連接沒有被回收,只要存在一個相同的,就證明連接被重復利用了

    ????????CapabilityForConnection.psize?+=poolTestMap.size();
    ????????
    if?(poolTestMap.size()?==
    ?EXECUTESUM)?{
    ????????????log.info(
    "不存在重復使用的連接,共創建"?+?poolTestMap.size()+?"個連接"
    ?);
    ????????}?
    else
    ?{
    ????????????log.info(
    "共使用"?+?poolTestMap.size()+?"個連接"
    ?);
    ????????}
    ????????clear();
    ????}

    ????
    private?static?void?startExec(int
    ?EXECUTESUM)?{
    ????????
    int?i?=?0
    ;
    ????????
    while?(i?<
    ?EXECUTESUM)?{
    ????????????
    if?(i++?<
    ?EXECUTESUM)?{
    ????????????????
    try
    ?{
    ????????????????????
    new
    ?PoolTest().start();
    ????????????????}?
    catch
    ?(Exception?ex2)?{
    ????????????????}
    ????????????}
    ????????}
    ????}
    ????
    private?static?void
    ?clear()?{
    ????????poolTestMap?
    =?new
    ?HashMap();
    ????}


    }

    簡單的不能再簡單的測試代碼:
    package?com.cea.repository.test.testdata;

    import
    ?com.cea.repository.connection.drive.ConnectionFactory;
    import
    ?java.sql.Connection;
    import
    ?java.sql.Statement;
    import
    ?java.sql.ResultSet;
    import
    ?java.sql.PreparedStatement;
    import
    ?java.util.HashMap;
    import
    ?java.util.Map;
    import
    ?java.util.List;
    import
    ?java.util.ArrayList;
    import
    ?com.cea.repository.test.PoolTest;
    import
    ?com.cea.repository.connection.poolpository.PoolFactory;

    /**

    ?*?
    ?*?

    Title:?


    ?*?

    Description:?


    ?*?

    Copyright:?Copyright?(c)?2004


    ?*?

    Company:?cea


    ?*?
    @author?小舟
    ?*?
    @version
    ?1.0
    ?
    */

    public?class?MainExecute?{
    ????
    public?static?void?main(String[]?args)?throws
    ?Exception?{
    ???????testConnection();
    ????}

    ????
    static?void?testConnection()?throws
    ?Exception?{
    ????????
    for?(int?i?=?0;?i?<?PoolTest.CONNECTIONS;?i++
    )?{
    ????????????Connection?con?
    =
    ?PoolFactory.newInstance();
    ????????????
    //這里的改變直接影響連接的復用

    ????????????Thread.sleep(50);
    ????????????PoolTest.poolTestMap.put(con.toString(),?
    ""
    );
    ????????????con.close();
    ????????}
    ????}

    }

    三個配置文件的內容:
    init.properties文件
    #運行的次數
    init
    =5

    #并發執行MainExecute的數量所匹配的名字
    name0
    =execsum
    #一次MainExecute執行所請求的連接數所匹配的名字
    name1
    =opencon

    reference.properties文件
    #過濾數據
    execsum0
    =10

    opencon0
    =1
    #第一次測試數據
    execsum1
    =100
    opencon1
    =6
    #第二次測試數據
    execsum2
    =85
    opencon2
    =9
    #第三次測試數據
    execsum3
    =140
    opencon3
    =3

    最后一個是pool-config.xml數據源配置:
    xml?version="1.0"?encoding="GB2312"?>
    <DataResources>
    ??
    <ResourceParams?dateIndentity="boat1">
    ????
    <defaultAutoCommit>falsedefaultAutoCommit>
    ????
    <initialSize>30initialSize>
    ????
    <maxActive>40maxActive>
    ????
    <minIdle>0minIdle>
    ????
    <maxIdle>18maxIdle>
    ????
    <maxWait>10000maxWait>
    ????
    <username>forumusername>
    ????
    <password>kingpassword>
    ????
    <driverClassName>oracle.jdbc.driver.OracleDriverdriverClassName>
    ????
    <url>jdbc:oracle:thin:@192.168.1.3:1521:gzesturl>
    ????
    <removeAbandoned>trueremoveAbandoned>
    ????
    <removeAbandonedTimeout>10removeAbandonedTimeout>
    ????
    <logAbandoned>truelogAbandoned>
    ??
    ResourceParams>
    DataResources>
    posted @ 2005-09-26 22:36 ceaboat 閱讀(1652) | 評論 (0)編輯 收藏

             影響性能的測試報告(數據庫版)

    引言

    如需轉載,請與筆者聯系

     

    前提:項目組里無用到SPRING進行事務的管理。項目里以功能劃分到每個人手里,

    形成了BODAOACTIONVIEW都是單人負責。在DAO中每個動作都以

          封閉式的形式存在。

    問題:造成事務的不連貫性。功能是做出來了,性能問題遲早暴露。

    測試:主要針對程序頻繁請求數據庫連接對WEB應用所造成影響做一個測試。

     

     

    先做必要的說明,一步步引入正題,先從性能瓶頸開始:

    性能瓶頸

    所有的應用程序都存在性能瓶頸,為了提高應用程序的性能,就要盡可能的減少程序的瓶頸。以下是在JAVA程序中經常存在的性能瓶頸。

    pingjing.jpg
    了解了這些瓶頸后,就可以有針對性的減少這些瓶頸,從而提高JAVA應用程序的性能

     

    數據庫連接池工作原理

    關于連接池的實現原理測試方案:

    經過資料的收集與APACHE DBCP里連接池的查閱,對現有的連接池工作

    原理有兩種方式:

    1.        數據庫預先設置配置好的連接數。待得到用戶請求連接,傳出一個連接,而后為了保持供應數再提前創建連接,即提前預備連接數供請求。比如:

    5個通行道代表最大激活的連接數,最小2個閑置連接數。也就是說連接池里始終預備了2個可隨時提供的連接,連接的創建開銷是比較大的,連接池的存在就是了能夠最小化的解決創建所等待的時間。

      1            O

      2            O

      3            *

      4            *

      5            *

      如上圖,當1分配出去時由于池中連接數剩一個,為保持最小閑置,會自動創建一個新的連接以防止再次請求等待創建的時間。這樣確實減少了等待的時間,但是數據庫創建的開銷方面并未得到解決。如果把1-5比喻成汽車,那么這種情況下每量車都是一次性使用。1被請求后下一個連接將是6來接替。那么如何能夠重復利用1減少數據庫開銷。于是引出第二種方式。

     

    2.        回收使用完后的連接,放回到池中進行循環利用。這么做必須能保證2

       .  使連接能夠保持有效的回收。

       .  約束使用者使用釋放的動作,而不是直接把連接close.

     

    本人使用的是APACHE DBCPBasicDataSource的連接池基本實現,

    經過代碼與測試結果顯示,其工作方式是基于二的。

     

    BasicDataSource測試用例

    請看測試用例

    測試結果:


    2組數據:

    并發應用數:100 模擬連接數:6

    運行平均耗時:2956

    共使用51個連接

    運行平均耗時:3391

    2共使用52個連接

    運行平均耗時:2616

    共使用47個連接

    運行平均耗時:3377

    共使用41個連接

    運行平均耗時:3673

    共使用46個連接

    2組數據共執行5;平均耗時為:3229毫秒

    平均使用47個連接

     

    3組數據:

    并發應用數:85 模擬連接數:9

    運行平均耗時:4830

    共使用53個連接

    運行平均耗時:3247

    共使用49個連接

    運行平均耗時:4116

    共使用40個連接

    運行平均耗時:4070

    共使用43個連接

    運行平均耗時:4053

    共使用54個連接

    3組數據共執行5;平均耗時為:4063毫秒

    平均使用47個連接

     

    4組數據:

    并發應用數:140 模擬連接數:3

    運行平均耗時:2076

    共使用47個連接

    運行平均耗時:3104

    共使用51個連接

    運行平均耗時:2048

    共使用43個連接

    運行平均耗時:2421

    共使用50個連接

    運行平均耗時:2751

    共使用50個連接

    4組數據共執行5;平均耗時為:2480毫秒

    平均使用48個連接

     

    每次測試的結果都可能不同,但是所得到的結論是一致的。數據顯示不合理的請求使用連接嚴重的影響應用所能承受的并發數量,響應的時間也因此受到影響。

     

    目前普遍存在的問題

    沒有把事務控制好,一般會出現以下的情況:

    事務(){

      流程1();

      流程2();

    }

    可以看出流程12里都是單獨創建連接,并在自己的流程里完成操作。

    如果在流程2里出現異常,那么流程1所做的操作是不可恢復的。

    如果能控制在事務范圍內,如:

    事務(){

      Connection con;

      流程1(con);

      流程2(con);

      con.close();

    }

    那么數據庫少提供一個連接,事務的完成性也得到體現。在并發數量大的時候,

    效率上就有非常明顯的區別。

    解決方案

    1.  盡量保持少的請求

    DAO中有update()方法,則應再擴展一個方法update(Connection conn)

    在業務邏輯事務里調用update(Connection conn),一般情況下調用update()

    2.  對于數據不變的情況采用緩存技術,或部分緩存技術。

          可參照一些相關的開源的項目(JIVE)。

    posted @ 2005-09-25 17:21 ceaboat 閱讀(1663) | 評論 (4)編輯 收藏
    把ent.slip放入\Borland\JBuilder2006\license里
    posted @ 2005-09-24 13:45 ceaboat 閱讀(811) | 評論 (2)編輯 收藏

    1.運行環境:
    JDK,ORACLE9i以上,CASTOR包。建議使用JBUILDE
    工具進行開發
    2.使用環境:
    采用ORM(關系對象映射)操作數據庫數據,適用于Application與WEB方式下的開發。

    3.功能:
        提供查詢,更新,刪除,插入(沒實現主鍵自動生成),(分頁暫時沒實現)。4.使用步驟:
    首先在數據庫建立一個cat表,字段為cat_id;name;sex;weight;類型1,4為數字型,2,
    3為字符串型。

    其次建立兩個配置文件(由自己定義文件名稱):
    repository.xml配置信息:
    <?xml version="1.0" encoding="UTF-8"?>
    <Repository>
     <TableDesc execid="CAT" identifyField="CAT_ID">
      <table>CAT</table>
      <condition />
     <FieldDesc name="CAT_ID" fieldType="java.lang.String" >
      <title>CAT_ID</title>
      </FieldDesc>
     <FieldDesc name="NAME" fieldType="java.lang.String" >
      <title>NAME</title>
      </FieldDesc>
     <FieldDesc name="SEX" fieldType="java.lang.String" >
      <title>SEX</title>
      </FieldDesc>
     <FieldDesc name="WEIGHT" fieldType="java.lang.Long" >
      <title>WEIGHT</title>
      </FieldDesc>
      </TableDesc>
    </Repository>
    配置文件的設計說明如下:
    TableDesc 表示一個表的聲明。
    Execid 是類名一般情況下最好和表名一致(容易找到對應關系),但是不允許有下劃線出現。注意這個類名不是全路徑。
    DentifyField 表中的主鍵,如果是復合主鍵則以逗號相隔開
    Table 數據庫表名
    <FieldDesc name="SEX" fieldType="java.lang.String" >
      <title>SEX</title>
      </FieldDesc>
    這里是表中字段的描述,name是字段名。 fieldType 是數據庫字段對
    應java中的類型,只有4中類型可填充:java.lang.String,
    java.lang.Long, java.util.Date, java.lang.Double
    title可要可不要.如果存在多個表,那么就在</TableDesc>和
    </Repository>之間加入表描述。

    pool-config.xml配置信息:
    <?xml version="1.0" encoding="GB2312"?>
    <ResourceParams>
    <maxActive>10</maxActive>
    <maxIdle>5</maxIdle>
    <maxWait>10000</maxWait>
    <username>test</username>
    <password>test</password>
    <driverClassName>oracle.jdbc.driver.OracleDriver</driverClassName>
    <url>jdbc:oracle:thin:@192.168.0.90:1521:forecast</url>
    <removeAbandoned>true</removeAbandoned>
    <removeAbandonedTimeout>60</removeAbandonedTimeout>
    <logAbandoned>true</logAbandoned>
    </ResourceParams>
    把上述信息保存為XML文件。對這個文件不多做說明了。

    確定兩個文件已經存在,接下來就是要創建表CAT。
    還有表所對應的BEAN。
    下面是我在Hibernate的一個例子中建立的VO。(借用)
    package com.cea.boat.dao;
      import java.util.*;
      public class Cat implements Cloneable  {
        //Declare Field
        private java.lang.String  catId;
        private java.lang.String  name;
        private java.lang.String  sex;
        private java.lang.Long  weight;
        //Get Method
        public java.lang.String getCatId() {
           return catId;
        }
        public java.lang.String getName() {
           return name;
        }
        public java.lang.String getSex() {
           return sex;
        }
        public java.lang.Long getWeight() {
           return weight;
        }
        //Set Method
        public void setCatId(java.lang.String catId) {
           this.catId=catId;
        }
        public void setName(java.lang.String name) {
           this.name=name;
        }
        public void setSex(java.lang.String sex) {
           this.sex=sex;
        }
        public void setWeight(java.lang.Long weight) {
           this.weight=weight;
        }
      public Object clone() {
        Object o = null;
        try {
          o = super.clone();
        }
        catch (CloneNotSupportedException ex) {
          System.out.println(o);
        }
        return o;
      }
      public boolean equals(Object obj) {
        Cat o = (Cat)obj;
        boolean result = true
            && (catId == o.catId || catId.equals(o.catId))
            && (name == o.name || name.equals(o.name))
            && (sex == o.sex || sex.equals(o.sex))
            && (weight == o.weight || weight.equals(o.weight))
        ;
        return result;
      }
      }
    到此已經完成了該做的事了,下面是一個使用的例子。

    l查詢方式:
    例子:
    Void testQuery() throws Exception{
        {
    System.setProperty(Const.RUN_KEY, Const.POOL_FACTORY_KEY);
          System.setProperty(Const.CONFIG_PATH,
                             "E:/project/CEAConnection/pool-config.xml");
          System.setProperty(Const.REPOSITORY_CONFIG_PATH,
                             "E:/project/CEAConnection/repository.xml");
    }

    ConnectionManage connectionManage = new ConnectionManage();
     connectionManage.activity("com.cea.boat.dao.Cat cat");
      
       Query Query=connectionManage.createQuery(“cat. Catid=’1’ ”);
        while (Query.hasNext()) {
          Object[] objects = Query.next();
          Cat cat = (Cat) objects[0];
        }
     connectionManage.close();
    }
    說明:
    在WEB中使用只需要在網站啟動時聲明一次即可。
    {
    //指明使用連接池
    System.setProperty(Const.RUN_KEY, Const.POOL_FACTORY_KEY);
    //連接池參數配置文件
          System.setProperty(Const.CONFIG_PATH,
                             "E:/project/CEAConnection/pool-config.xml");
    //配置文件指定
          System.setProperty(Const.REPOSITORY_CONFIG_PATH,
                             "E:/project/CEAConnection/repository.xml");
    }

       聲明一個連接管理者,管理數據庫資源,事務的起始,它的生命周期最好是在一個事務結束就完結,當然你也可以在這個事務完結時繼續用這個實例,來創建下一個事務的開始。不建議如此使用。
        ConnectionManage DataManage = new ConnectionManage();
       
    激活要使用類(在配置中必須有Cat),類名為全路徑如果要使用多個對象,則對象間要用逗號相隔開
    connectionManage.activity("com.cea.boat.dao.Cat cat");

    這里只需要給出SQL查詢條件比如SQL中是select * from cat cat where cat.Catid=‘1’那么 select * from cat cat where 這里后臺已經幫你完成,你需要做的就是把條件完成,如果沒有條件則為空.
    Query Query = connectionManage.createQuery(“cat. Catid=’1’ ”);


       Query.hasNext()的作用相當于resultset.next()查看是否還存在記錄,Query.next()返回一個對象數組這里如果activity的是多個對象,那么objects里會順序的存儲相應的對象實例,使用的時候強制轉化就可以了。
    while (Query.hasNext()) {
          Object[] objects = Query.next();
          Cat cat = (Cat) objects[0];
      }

    使用完畢,釋放使用的數據庫資源
     connectionManage.close();

    l新增方式:
      由于沒有主鍵自動生成,因此主鍵暫時只能由自己來維護,要保證catid為111的在表里不存在,否則會出現異常。
    Void testInsert() throws Exception{
    Cat cat = new Cat();
    cat. setCatId(“111”);
        cat. SetSex(“F”);
        cat. setName(“catm”);
        ConnectionManage cm = new ConnectionManage();
        cm.create(cat);
        cm.commit();
    cm.close();
    }

    l更新方式:
    表里已經存在catid為111的貓,否則查不到這條記錄就更新不了信息
    Void testUpdate() throws Exception{
    Cat cat = new Cat();
    cat. setCatId(“111”);
        cat. SetSex(“F”);
        cat. setName(“catmm”);
        ConnectionManage cm = new ConnectionManage();
        cm.update(cat);
        cm.commit();
    cm.close();
    }

    l刪除方式:
    刪除方式比較簡單,只要給出對象,并且主鍵值不為空,就可以刪除表中記錄。
    Void testDelete() throws Exception{
    Cat cat = new Cat();
    cat. setCatId(“111”);
        ConnectionManage cm = new ConnectionManage();
        cm.delete(cat);
        cm.commit();
    cm.close();
    }

    posted @ 2005-09-15 23:41 ceaboat 閱讀(432) | 評論 (0)編輯 收藏
    主站蜘蛛池模板: 亚洲精品视频观看| 免费高清在线爱做视频| 亚洲精品456播放| 亚洲欧美国产欧美色欲| AV片在线观看免费| 2020久久精品亚洲热综合一本| 99久久国产热无码精品免费| 亚洲卡一卡2卡三卡4麻豆| 国产精品成人免费一区二区| 免费黄网站在线观看| 亚洲视频在线观看网站| 18禁成年无码免费网站无遮挡| 久久免费国产视频| 亚洲国产日韩精品| 亚洲国产一区视频| 宅男666在线永久免费观看| 在线观看免费黄网站| 亚洲第一页中文字幕| 久久91亚洲人成电影网站| 亚洲视频免费观看| 亚洲AV无码成人精品区狼人影院| 四虎永久免费地址在线网站| 青柠影视在线观看免费高清| 亚洲1234区乱码| 亚洲无人区一区二区三区| 免费不卡视频一卡二卡| a级毛片免费高清视频| 久久精品国产亚洲av麻豆小说| 四虎影院免费在线播放| 青青草无码免费一二三区| 蜜臀亚洲AV无码精品国产午夜.| 国产AV无码专区亚洲精品| 国产aⅴ无码专区亚洲av麻豆| 日本XXX黄区免费看| 无遮免费网站在线入口| 免费视频专区一国产盗摄| 一二三四影视在线看片免费 | 男女猛烈激情xx00免费视频| 中文字幕亚洲精品| 亚洲欧洲日产国码在线观看| 国产亚洲自拍一区|