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

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

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

    小菜毛毛技術分享

    與大家共同成長

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks

    #

    如果是使用的catalina.sh(linux)或Catalina.bat(win)啟動的:修改這兩個文件,加上下面這句: SET CATALINA_OPTS= -Xms64m -Xmx128m 如果使用的winnt服務啟動:打開C:\WINNT\system32\regedt32.exe,在HKEY_LOCAL_MACHINE-->SOFTWARE-->Apache Software Foundation-->Process Runner 1.0-->Tomcat5-->Parameters 修改屬性: -Xms64m -Xmx128m 有人建議Xms和Xmx的值取成一樣比較好,說是可以加快內存回收速度。但未經本人驗證過。有興趣可以試試。 加大tomcat連接數: 在tomcat配置文件server.xml中的配置中,和連接數相關的參數有: minProcessors:最小空閑連接線程數,用于提高系統處理性能,默認值為10 maxProcessors:最大連接線程數,即:并發處理的最大請求數,默認值為75 acceptCount:允許的最大連接數,應大于等于maxProcessors,默認值為100 enableLookups:是否反查域名,取值為:true或false。為了提高處理能力,應設置為false connectionTimeout:網絡連接超時,單位:毫秒。設置為0表示永不超時,這樣設置有隱患的。通常可設置為30000毫秒。 其中和最大連接數相關的參數為maxProcessors和acceptCount。如果要加大并發連接數,應同時加大這兩個參數。 web server允許的最大連接數還受制于操作系統的內核參數設置,通常Windows是2000個左右,Linux是1000個左右。
    posted @ 2010-01-18 14:06 小菜毛毛 閱讀(459) | 評論 (0)編輯 收藏

    問題表現:

    當用戶執行一個大數據的應用時(凈字節碼量約為5M)時,系統會提示出錯:

    前臺錯誤為:HTTP Status 500-Dispatch[EAITool] to method listCurTree retrun an exception

    (以下省略)

    ………………………………………………………

    ………………………………………………………

    后臺錯誤為:java.lang.OutOfMemoryError: unable to create new native thread
            at java.lang.Thread.start(Native Method)
            at org.apache.catalina.loader.WebappLoader.notifyContext(WebappLoader.ja
    va:847)

    (以下省略)

    ………………………………………………………

    ………………………………………………………

    問題分析:

       由于TOMCAT內存溢出而引發的問題,主要原因是JVM的虛擬內存默認為128M,當超過這個值時就把先前占用的內存釋放,而導致好象TCP/IP丟包的假象,出現HTTP500的錯誤。  
          解決方法主要是加大TOMCAT可利用內存,并在程序當中加大內存使用。

    解決方法:

    方法:加大TOMCAT可利用內存:
      在TOMCAT的目錄下,也就是在TOMCAT41/bin/catalina.bat文件最前面加入
      set JAVA_OPTS=-Xms800m -Xmx800m
      表現效果是當你啟動TOMCAT時,系統內存會增加近800M使用

    操作方法:
      1)、先關掉WINDOWS服務當中的TOMCAT4服務。
      2)、再找到TOMCAT/BIN目錄下startup.bat,雙擊打開它,你會發現現WINDOWS內存占用會增加近800M
      3)、執行程序,因為是TOMCAT重新編譯程序,所以第一次會比較慢。

    結論:

    經過測試,我們得出如下數據:

    系統傳輸約2000條數據時,大約近12M的凈數據(不壓縮時),系統輔助運行的內存大約占用150M左右的空間,也就是近200M的內存占用,而我們擴大了近800MJAVA內存使用,這對于業務本身來說是足夠了。所以你們不用擔心大數據量的傳遞問題。

    基于JAVA虛擬機的原理,JAVA自動有垃圾回收機制,也就是在你對一些內存長時間不使用時(近2分鐘,取決于使用頻度和優先級等),就會自動垃圾回收,從而釋放不用的內存占用。

    posted @ 2010-01-18 14:05 小菜毛毛 閱讀(1251) | 評論 (0)編輯 收藏

    單態定義:
    Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。

    在很多操作中,比如建立目錄 數據庫連接都需要這樣的單線程操作。

    還有, singleton能夠被狀態化; 這樣,多個單態類在一起就可以作為一個狀態倉庫一樣向外提供服務,比如,你要論壇中的帖子計數器,每次瀏覽一次需要計數,單態類能否保持住這個計數,并且能synchronize的安全自動加1,如果你要把這個數字永久保存到數據庫,你可以在不修改單態接口的情況下方便的做到。

    另外方面,Singleton也能夠被無狀態化。提供工具性質的功能,

    Singleton模式就為我們提供了這樣實現的可能。使用Singleton的好處還在于可以節省內存,因為它限制了實例的個數,有利于Java垃圾回收(garbage collection)。

    我們常常看到工廠模式中類裝入器(class loader)中也用Singleton模式實現的,因為被裝入的類實際也屬于資源。

    如何使用?
    一般Singleton模式通常有幾種形式:

    public class Singleton {

      private Singleton(){}

      //在自己內部定義自己一個實例,是不是很奇怪?
      //注意這是private 只供內部調用

      private static Singleton instance = new Singleton();

      //這里提供了一個供外部訪問本class的靜態方法,可以直接訪問  
      public static Singleton getInstance() {
        return instance;   
       }
    }

     

    第二種形式:

    public class Singleton {

      private static Singleton instance = null;

      public static synchronized Singleton getInstance() {

      if (instance==null)
        instance=new Singleton();
      return instance;   }

    }

     

    使用Singleton.getInstance()可以訪問單態類。

    上面第二中形式是lazy initialization,也就是說第一次調用時初始Singleton,以后就不用再生成了。

    注意到lazy initialization形式中的synchronized,這個synchronized很重要,如果沒有synchronized,那么使用getInstance()是有可能得到多個Singleton實例。關于lazy initialization的Singleton有很多涉及double-checked locking (DCL)的討論,有興趣者進一步研究。

    一般認為第一種形式要更加安全些。

    使用Singleton注意事項
    有時在某些情況下,使用Singleton并不能達到Singleton的目的,如有多個Singleton對象同時被不同的類裝入器裝載;在EJB這樣的分布式系統中使用也要注意這種情況,因為EJB是跨服務器,跨JVM的。

    我們以SUN公司的寵物店源碼(Pet Store 1.3.1)的ServiceLocator為例稍微分析一下:

    在Pet Store中ServiceLocator有兩種,一個是EJB目錄下;一個是WEB目錄下,我們檢查這兩個ServiceLocator會發現內容差不多,都是提供EJB的查詢定位服務,可是為什么要分開呢?仔細研究對這兩種ServiceLocator才發現區別:在WEB中的ServiceLocator的采取Singleton模式,ServiceLocator屬于資源定位,理所當然應該使用Singleton模式。但是在EJB中,Singleton模式已經失去作用,所以ServiceLocator才分成兩種,一種面向WEB服務的,一種是面向EJB服務的。

    Singleton模式看起來簡單,使用方法也很方便,但是真正用好,是非常不容易,需要對Java的類 線程 內存等概念有相當的了解。

    總之:如果你的應用基于容器,那么Singleton模式少用或者不用,可以使用相關替代技術。

     

    進一步深入可參考:

    Double-checked locking and the Singleton pattern

    When is a singleton not a singleton?

    Singleton是邪惡的

    關于web應用的static變量

    Jive中的單例模式

    更多單例專題

    更多本模式專題

    更多線程安全專題

    更多同步或鎖專題

    更多對象生命周期專題

    posted @ 2010-01-11 13:44 小菜毛毛 閱讀(302) | 評論 (0)編輯 收藏

    c:forEach標簽的使用

    在JSP的開發中,迭代是經常要使用到的操作。例如,逐行的顯示查詢的結果等。在早期的JSP中,通常使用Scriptlets來實現Iterator或者Enumeration對象的迭代輸出。現在,通過JSTL的迭代標簽可以在很大的程度上簡化迭代操作。

               JSTL所支持的迭代標簽有兩個,分別是c:forEach和c:forTokens。在這里介紹的是c:forEach標簽。

               簡單點說,<c:forEach>標簽的作用就是迭代輸出標簽內部的內容。它既可以進行固定次數的迭代輸出,也可以依據集合中對象的個數來決定迭代的次數。

               c:forEach標簽的語法定義如下所示。

    xml 代碼
    1. <c:forEach var="name" items="expression" varStatus="name"    
    2.   
    3.          begin="expression" end="expression" step="expression">  
    4.   
    5.          body content    
    6.   
    7. </c:forEach>  


               <c:forEach>標簽具有以下一些屬性:

    l            var:迭代參數的名稱。在迭代體中可以使用的變量的名稱,用來表示每一個迭代變量。類型為String。

    l            items:要進行迭代的集合。對于它所支持的類型將在下面進行講解。

    l            varStatus:迭代變量的名稱,用來表示迭代的狀態,可以訪問到迭代自身的信息。

    l            begin:如果指定了items,那么迭代就從items[begin]開始進行迭代;如果沒有指定items,那么就從begin開始迭代。它的類型為整數。

    l            end:如果指定了items,那么就在items[end]結束迭代;如果沒有指定items,那么就在end結束迭代。它的類型也為整數。

    l            step:迭代的步長。

               <c:forEach>標簽的items屬性支持Java平臺所提供的所有標準集合類型。此外,您可以使用該操作來迭代數組(包括基本類型數組)中的元素。它所支持的集合類型以及迭代的元素如下所示:

    l            java.util.Collection:調用iterator()來獲得的元素。

    l            java.util.Map:通過java.util.Map.Entry所獲得的實例。

    l            java.util.Iterator:迭代器元素。

    l            java.util.Enumeration:枚舉元素。

    l            Object實例數組:數組元素。

    l            基本類型值數組:經過包裝的數組元素。

    l            用逗號定界的String:分割后的子字符串。

    l            javax.servlet.jsp.jstl.sql.Result:SQL查詢所獲得的行。

               不論是對整數還是對集合進行迭代,<c:forEach>的varStatus屬性所起的作用相同。和var屬性一樣,varStatus用于創建限定了作用域的變量(改變量只在當前標簽體內起作用)。不過,由varStatus屬性命名的變量并不存儲當前索引值或當前元素,而是賦予javax.servlet.jsp.jstl.core.LoopTagStatus類的實例。該類包含了一系列的特性,它們描述了迭代的當前狀態,如下這些屬性的含義如下所示:

    l            current:當前這次迭代的(集合中的)項。

    l            index:當前這次迭代從0開始的迭代索引。

    l            count:當前這次迭代從1開始的迭代計數。

    l            first:用來表明當前這輪迭代是否為第一次迭代,該屬性為boolean類型。

    l            last:用來表明當前這輪迭代是否為最后一次迭代,該屬性為boolean類型。

    l            begin:begin屬性的值。

    l            end:end屬性的值

    l            step:step屬性的值

    下面就來看一個個基本的例子,表格隔行背景色變化
    xml 代碼
    1. <c:forEach var="item" items="${contents}" varStatus="status">  
    2.       <tr <c:if test="${status.count%2==0}">bgcolor="#CCCCFE"</c:if> align="left">  
    3.             xxx   
    4.             </tr>  
    posted @ 2010-01-08 15:56 小菜毛毛 閱讀(349) | 評論 (0)編輯 收藏

    配置的前提是要有裝oracle的驅動程序,如果有裝oracle服務器端或客戶端就自動安裝上的oracle的驅動程序
    1、database->generate database
    2、general->Direct generation  如果沒有配置好數據源,就要點數據庫的圖標
    3、配置Data Sourcce
    選擇ODBC machine data source
    選擇Configure
    4、點擊添加data source 選擇用戶數據源(只用于當前機器)
    5、選擇oracle驅動,填寫新建的數據源的名字即可!
    posted @ 2010-01-08 09:39 小菜毛毛 閱讀(1732) | 評論 (0)編輯 收藏

    Hex number system
      是計算機中數據的一種表示方法.同我們日常中的十進制表示法不一樣.它由0-9,A-F,組成.與10進制的對應關系是:
      0-9對應0-9;
      A-F對應10-15;
      N進制的數可以用0---(N-1)的數表示超過9的用字母A-F
      例如:
      10進制的32表示成16進制就是:20
      16進制的32表示成10進制就是:3×16^1+2×16^0=50
      6.1 為什么需要八進制和十六進制?
      編程中,我們常用的還是10進制……畢竟C/C++是高級語言。
      比如:
      int a = 100,b = 99;
      不過,由于數據在計算機中的表示,最終以二進制的形式存在,所以有時候使用二進制,可以更直觀地解決問題。
      但,二進制數太長了。比如int 類型占用4個字節,32位。比如100,用int類型的二進制數表達將是:
      0000 0000 0000 0000 0110 0100
      面對這么長的數進行思考或操作,沒有人會喜歡。因此,C,C++ 沒有提供在代碼直接寫二進制數的方法。
      用16進制或8進制可以解決這個問題。因為,進制越大,數的表達長度也就越短。不過,為什么偏偏是16或8進制,而不其它的,諸如9或20進制呢?
      2、8、16,分別是2的1次方,3次方,4次方。這一點使得三種進制之間可以非常直接地互相轉換。8進制或16進制縮短了二進制數,但保持了二進制數的表達特點。在下面的關于進制轉換的課程中,你可以發現這一點。
      6.2 二、八、十六進制數轉換到十進制數
      6.2.1 二進制數轉換為十進制數
      二進制數第0位的權值是2的0次方,第1位的權值是2的1次方……
      所以,設有一個二進制數:0110 0100,轉換為10進制為:
      下面是豎式:
      0110 0100 換算成 十進制
      第0位 0 * 2^0 = 0
      第1位 0 * 2^1 = 0
      第2位 1 * 2^2 = 4
      第3位 0 * 2^3 = 0
      第4位 0 * 2^4 = 0
      第5位 1 * 2^5 = 32
      第6位 1 * 2^6 = 64
      第7位 0 * 2^7 = 0 +
      ---------------------------
      100
      用橫式計算為:
      0 * 2^0 + 0 * 2^1 + 1 * 2^2 + 0 * 2^3 + 0 * 2^4 + 1 * 2^5 + 1 * 2^6 + 0 * 2^7 = 100
      0乘以多少都是0,所以我們也可以直接跳過值為0的位:
      1 * 2^2 + 1 * 2^3 + 1 * 2^5 + 1 * 2^6 = 100
      上面錯的,改
      1 * 2^2 + 1 * 2^5 + 1 * 2^6 = 100
      4 + 32 + 64 =100
      6.2.2 八進制數轉換為十進制數
      八進制就是逢8進1。
      八進制數采用 0~7這八數來表達一個數。
      八進制數第0位的權值為8的0次方,第1位權值為8的1次方,第2位權值為8的2次方……
      所以,設有一個八進制數:1507,轉換為十進制為:
      用豎式表示:
      1507換算成十進制。
      第0位 7 * 8^0 = 7
      第1位 0 * 8^1 = 0
      第2位 5 * 8^2 = 320
      第3位 1 * 8^3 = 512 +
      --------------------------
      839
      同樣,我們也可以用橫式直接計算:
      7 * 8^0 + 0 * 8^1 + 5 * 8^2 + 1 * 8^3 = 839
      結果是,八進制數 1507 轉換成十進制數為 839
      6.2.3 八進制數的表達方法
      C,C++語言中,如何表達一個八進制數呢?如果這個數是 876,我們可以斷定它不是八進制數,因為八進制數中不可能出7以上的阿拉伯數字。但如果這個數是123、是567,或12345670,那么它是八進制數還是10進制數,都有可能。
      所以,C,C++規定,一個數如果要指明它采用八進制,必須在它前面加上一個0,如:123是十進制,但0123則表示采用八進制。這就是八進制數在C、C++中的表達方法。
      由于C和C++都沒有提供二進制數的表達方法,所以,這里所學的八進制是我們學習的,CtC++語言的數值表達的第二種進制法。
      現在,對于同樣一個數,比如是100,我們在代碼中可以用平常的10進制表達,例如在變量初始化時:
      int a = 100;
      我們也可以這樣寫:
      int a = 0144; //0144是八進制的100;一個10進制數如何轉成8進制,我們后面會學到。
      千萬記住,用八進制表達時,你不能少了最前的那個0。否則計算機會通通當成10進制。不過,有一個地方使用八進制數時,卻不能使用加0,那就是我們前面學的用于表達字符的“轉義符”表達法。
      6.2.4 八進制數在轉義符中的使用
      我們學過用一個轉義符\'\\'加上一個特殊字母來表示某個字符的方法,如:\'\n\'表示換行(line),而\'\t\'表示Tab字符,\'\\'\'則表示單引號。今天我們又學習了一種使用轉義符的方法:轉義符\'\\'后面接一個八進制數,用于表示ASCII碼等于該值的字符。
      比如,查一下第5章中的ASCII碼表,我們找到問號字符(?)的ASCII值是63,那么我們可以把它轉換為八進值:77,然后用 \'\77\'來表示\'?\'。由于是八進制,所以本應寫成 \'\077\',但因為C,C++規定不允許使用斜杠加10進制數來表示字符,所以這里的0可以不寫。
      事實上我們很少在實際編程中非要用轉義符加八進制數來表示一個字符,所以,6.2.4小節的內容,大家僅僅了解就行。
      6.2.5 十六進制數轉換成十進制數
      2進制,用兩個阿拉伯數字:0、1;
      8進制,用八個阿拉伯數字:0、1、2、3、4、5、6、7;
      10進制,用十個阿拉伯數字:0到9;
      16進制,用十六個阿拉伯數字……等等,阿拉伯人或說是印度人,只發明了10個數字啊?
      16進制就是逢16進1,但我們只有0~9這十個數字,所以我們用A,B,C,D,E,F這五個字母來分別表示10,11,12,13,14,15。字母不區分大小寫。
      十六進制數的第0位的權值為16的0次方,第1位的權值為16的1次方,第2位的權值為16的2次方……
      所以,在第N(N從0開始)位上,如果是是數 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小為 X * 16的N次方。
      假設有一個十六進數 2AF5, 那么如何換算成10進制呢?
      用豎式計算: 2AF5換算成10進制:
      第0位: 5 * 16^0 = 5
      第1位: F * 16^1 = 240
      第2位: A * 16^2 = 2560
      第3位: 2 * 16^3 = 8192 +
      -------------------------------------
      10997
      直接計算就是:
      5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997
      (別忘了,在上面的計算中,A表示10,而F表示15)
      現在可以看出,所有進制換算成10進制,關鍵在于各自的權值不同。
      假設有人問你,十進數 1234 為什么是 一千二百三十四?你盡可以給他這么一個算式:
      1234 = 1 * 10^3 + 2 * 10^2 + 3 * 10^1 + 4 * 10^0
      6.2.6 十六進制數的表達方法
      如果不使用特殊的書寫形式,16進制數也會和10進制相混。隨便一個數:9876,就看不出它是16進制或10進制。
      C,C++規定,16進制數必須以 0x開頭。比如 0x1表示一個16進制數。而1則表示一個十進制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不區分大小寫。(注意:0x中的0是數字0,而不是字母O)
      以下是一些用法示例:
      int a = 0x100F;
      int b = 0x70 + a;
      至此,我們學完了所有進制:10進制,8進制,16進制數的表達方式。最后一點很重要,C/C++中,10進制數有正負之分,比如12表示正12,而-12表示負12,;但8進制和16進制只能用達無符號的正整數,如果你在代碼中里:-078,或者寫:-0xF2,C,C++并不把它當成一個負數。
      6.2.7 十六進制數在轉義符中的使用
      轉義符也可以接一個16進制數來表示一個字符。如在6.2.4小節中說的 \'?\' 字符,可以有以下表達方式:
      \'?\' //直接輸入字符
      \'\77\' //用八進制,此時可以省略開頭的0
      \'\0x3F\' //用十六進制
      同樣,這一小節只用于了解。除了空字符用八進制數 \'\0\' 表示以外,我們很少用后兩種方法表示一個字符。
      6.3 十進制數轉換到二、八、十六進制數
      6.3.1 10進制數轉換為2進制數
      給你一個十進制,比如:6,如果將它轉換成二進制數呢?
      10進制數轉換成二進制數,這是一個連續除2的過程:
      把要轉換的數,除以2,得到商和余數,
      將商繼續除以2,直到商為0。最后將所有余數倒序排列,得到數就是轉換結果。
      聽起來有些糊涂?我們結合例子來說明。比如要轉換6為二進制數。
      “把要轉換的數,除以2,得到商和余數”。
      那么:
      要轉換的數是6, 6 ÷ 2,得到商是3,余數是0。 (不要告訴我你不會計算6÷3!)
      “將商繼續除以2,直到商為0……”
      現在商是3,還不是0,所以繼續除以2。
      那就: 3 ÷ 2, 得到商是1,余數是1。
      “將商繼續除以2,直到商為0……”
      現在商是1,還不是0,所以繼續除以2。
      那就: 1 ÷ 2, 得到商是0,余數是1 (拿筆紙算一下,1÷2是不是商0余1!)
      “將商繼續除以2,直到商為0……最后將所有余數倒序排列”
      好極!現在商已經是0。
      我們三次計算依次得到余數分別是:0、1、1,將所有余數倒序排列,那就是:110了!
      6轉換成二進制,結果是110。
      把上面的一段改成用表格來表示,則為:
      被除數 計算過程 商 余數
      6 6/2 3 0
      3 3/2 1 1
      1 1/2 0 1
      (在計算機中,÷用 / 來表示)
      如果是在考試時,我們要畫這樣表還是有點費時間,所更常見的換算過程是使用下圖的連除:
      (圖:1)
      請大家對照圖,表,及文字說明,并且自己拿筆計算一遍如何將6轉換為二進制數。
      說了半天,我們的轉換結果對嗎?二進制數110是6嗎?你已經學會如何將二進制數轉換成10進制數了,所以請現在就計算一下110換成10進制是否就是6。
      6.3.2 10進制數轉換為8、16進制數
      非常開心,10進制數轉換成8進制的方法,和轉換為2進制的方法類似,唯一變化:除數由2變成8。
      來看一個例子,如何將十進制數120轉換成八進制數。
      用表格表示:
      被除數 計算過程 商 余數
      120 120/8 15 0
      15 15/8 1 7
      1 1/8 0 1
      120轉換為8進制,結果為:170。
      非常非常開心,10進制數轉換成16進制的方法,和轉換為2進制的方法類似,唯一變化:除數由2變成16。
      同樣是120,轉換成16進制則為:
      被除數 計算過程 商 余數
      120 120/16 7 8
      7 7/16 0 7
      120轉換為16進制,結果為:78。
      請拿筆紙,采用(圖:1)的形式,演算上面兩個表的過程。
      6.4 二、十六進制數互相轉換
      二進制和十六進制的互相轉換比較重要。不過這二者的轉換卻不用計算,每個C,C++程序員都能做到看見二進制數,直接就能轉換為十六進制數,反之亦然。
      我們也一樣,只要學完這一小節,就能做到。
      首先我們來看一個二進制數:1111,它是多少呢?
      你可能還要這樣計算:1 * 2^0 + 1 * 2^1 + 1 * 2^2 + 1 * 2^3 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。
      然而,由于1111才4位,所以我們必須直接記住它每一位的權值,并且是從高位往低位記,:8、4、2、1。即,最高位的權值為2^3 = 8,然后依次是 2^2 = 4,2^1=2, 2^0 = 1。
      記住8421,對于任意一個4位的二進制數,我們都可以很快算出它對應的10進制值。
      下面列出四位二進制數 xxxx 所有可能的值(中間略過部分)
      僅4位的2進制數 快速計算方法 十進制值 十六進值
      1111 = 8 + 4 + 2 + 1 = 15 F
      1110 = 8 + 4 + 2 + 0 = 14 E
      1101 = 8 + 4 + 0 + 1 = 13 D
      1100 = 8 + 4 + 0 + 0 = 12 C
      1011 = 8 + 0 + 2 + 1 = 11 B
      1010 = 8 + 0 + 2 + 0 = 10 A
      1001 = 8 + 0 + 0 + 1 = 10 9
      ....
      0001 = 0 + 0 + 0 + 1 = 1 1
      0000 = 0 + 0 + 0 + 0 = 0 0
      二進制數要轉換為十六進制,就是以4位一段,分別轉換為十六進制。
      如(上行為二制數,下面為對應的十六進制):
      1111 1101 , 1010 0101 , 1001 1011
      F D , A 5 , 9 B
      反過來,當我們看到 FD時,如何迅速將它轉換為二進制數呢?
      先轉換F:
      看到F,我們需知道它是15(可能你還不熟悉A~F這五個數),然后15如何用8421湊呢?應該是8 + 4 + 2 + 1,所以四位全為1 :1111。
      接著轉換 D:
      看到D,知道它是13,13如何用8421湊呢?應該是:8 + 4 + 1,即:1101。
      所以,FD轉換為二進制數,為: 1111 1101
      由于十六進制轉換成二進制相當直接,所以,我們需要將一個十進制數轉換成2進制數時,也可以先轉換成16進制,然后再轉換成2進制。
      比如,十進制數 1234轉換成二制數,如果要一直除以2,直接得到2進制數,需要計算較多次數。所以我們可以先除以16,得到16進制數:
      被除數 計算過程 商 余數
      1234 1234/16 77 2
      77 77/16 4 13 (D)
      4 4/16 0 4
      結果16進制為: 0x4D2
      然后我們可直接寫出0x4D2的二進制形式: 0100 1101 0010。
      其中對映關系為:
      0100 -- 4
      1011 -- D
      0010 -- 2
      同樣,如果一個二進制數很長,我們需要將它轉換成10進制數時,除了前面學過的方法是,我們還可以先將這個二進制轉換成16進制,然后再轉換為10進制。
      下面舉例一個int類型的二進制數:
      01101101 11100101 10101111 00011011
      我們按四位一組轉換為16進制: 6D E5 AF 1B
      6.5 原碼、反碼、補碼
      結束了各種進制的轉換,我們來談談另一個話題:原碼、反碼、補碼。
      我們已經知道計算機中,所有數據最終都是使用二進制數表達。
      我們也已經學會如何將一個10進制數如何轉換為二進制數。
      不過,我們仍然沒有學習一個負數如何用二進制表達。
      比如,假設有一 int 類型的數,值為5,那么,我們知道它在計算機中表示為:
      00000000 00000000 00000000 00000101
      5轉換成二制是101,不過int類型的數占用4字節(32位),所以前面填了一堆0。
      現在想知道,-5在計算機中如何表示?
      在計算機中,負數以其正值的補碼形式表達。
      什么叫補碼呢?這得從原碼,反碼說起。
      原碼:一個整數,按照絕對值大小轉換成的二進制數,稱為原碼。
      比如 00000000 00000000 00000000 00000101 是 5的 原碼。
      反碼:將二進制數按位取反,所得的新二進制數稱為原二進制數的反碼。
      取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)
      比如:將00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
      稱:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反碼。
      反碼是相互的,所以也可稱:
      11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互為反碼。
      補碼:反碼加1稱為補碼。
      也就是說,要得到一個數的補碼,先得到反碼,然后將反碼加上1,所得數稱為補碼。
      比如:00000000 00000000 00000000 00000101 的反碼是:11111111 11111111 11111111 11111010。
      那么,補碼為:
      11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
      所以,-5 在計算機中表達為:11111111 11111111 11111111 11111011。轉換為十六進制:0xFFFFFFFB。
      再舉一例,我們來看整數-1在計算機中如何表示。
      假設這也是一個int類型,那么:
      1、先取1的原碼:00000000 00000000 00000000 00000001
      2、得反碼: 11111111 11111111 11111111 11111110
      3、得補碼: 11111111 11111111 11111111 11111111
      可見,-1在計算機里用二進制表達就是全1。16進制為:0xFFFFFF。
      一切都是紙上說的……說-1在計算機里表達為0xFFFFFF,我能不能親眼看一看呢?當然可以。利用C++ Builder的調試功能,我們可以看到每個變量的16進制值。
      6.6 通過調試查看變量的值
      下面我們來動手完成一個小小的實驗,通過調試,觀察變量的值。
      我們在代碼中聲明兩個int 變量,并分別初始化為5和-5。然后我們通過CB提供的調試手段,可以查看到程序運行時,這兩個變量的十進制值和十六進制值。
      首先新建一個控制臺工程。加入以下黑體部分(就一行):
      //---------------------------------------------------------------------------
      #pragma hdrstop
      //---------------------------------------------------------------------------
      #pragma argsused
      int main(int argc, char* argv[])
      {
      int aaaa = 5, bbbbb = -5;
      return 0;
      }
      //---------------------------------------------------------------------------
      沒有我們熟悉的的那一行:
      getchar();
      所以,如果全速運行這個程序,將只是DOS窗口一閃而過。不過今天我們將通過設置斷點,來使用程序在我們需要的地兒停下來。
      設置斷點:最常用的調試方法之一,使用程序在運行時,暫停在某一代碼位置,
      在CB里,設置斷點的方法是在某一行代碼上按F5或在行首欄內單擊鼠標。
      如下圖:
      在上圖中,我們在return 0;這一行上設置斷點。斷點所在行將被CB以紅色顯示。
      接著,運行程序(F9),程序將在斷點處停下來。
      (請注意兩張圖的不同,前面的圖是運行之前,后面這張是運行中,左邊的箭頭表示運行運行到哪一行)
      當程序停在斷點的時,我們可以觀察當前代碼片段內,可見的變量。觀察變量的方法很多種,這里我們學習使用Debug Inspector (調試期檢視),來全面觀察一個變量。
      以下是調出觀察某一變量的 Debug Inspector 窗口的方法:
      先確保代碼窗口是活動窗口。(用鼠標點一下代碼窗口)
      按下Ctrl鍵,然后將鼠標挪到變量 aaaa 上面,你會發現代碼中的aaaa變藍,并且出現下劃線,效果如網頁中的超鏈接,而鼠標也變成了小手狀:
      點擊鼠標,將出現變量aaaa的檢視窗口:
      (筆者使用的操作系統為WindowsXP,窗口的外觀與Win9X有所不同)
      從該窗口,我可以看到:
      aaaa :變量名
      int :變量的數據類型
      0012FF88:變量的內存地址,請參看5.2 變量與內存地址;地址總是使用十六進制表達
      5 : 這是變量的值,即aaaa = 5;
      0x00000005 :同樣是變量的值,但采用16進制表示。因為是int類型,所以占用4字節。
      首先先關閉前面的用于觀察變量aaaa的Debug Inspector窗口。
      現在,我們用同樣的方法來觀察變量bbbb,它的值為-5,負數在計算機中使用補碼表示。
      正如我們所想,-5的補碼為:0xFFFFFFFB。
      再按一次F9,程序將從斷點繼續運行,然后結束。
      6.7 本章小結
      很難學的一章?
      來看看我們主要學了什么:
      1)我們學會了如何將二、八、十六進制數轉換為十進制數。
      三種轉換方法是一樣的,都是使用乘法。
      2)我們學會了如何將十進制數轉換為二、八、十六進制數。
      方法也都一樣,采用除法。
      3)我們學會了如何快速的地互換二進制數和十六進制數。
      要訣就在于對二進制數按四位一組地轉換成十六進制數。
      在學習十六進制數后,我們會在很多地方采用十六進制數來替代二進制數。
      4)我們學習了原碼、反碼、補碼。
      把原碼的0變1,1變0,就得到反碼。要得到補碼,則先得反碼,然后加1。
      以前我們只知道正整數在計算機里是如何表達,現在我們還知道負數在計算機里使用其絕對值的補碼表達。
      比如,-5在計算機中如何表達?回答是:5的補碼。
      5)最后我們在上機實驗中,這會了如何設置斷點,如何調出Debug Inspector窗口觀察變量。
      以后我們會學到更多的調試方法。
      daiqionghui 修改一部分錯的。、
      十六進制
      rkb-irir rtrt*-7-759-9urelurugf 44ihub 十六進制
    posted @ 2009-12-18 17:02 小菜毛毛 閱讀(486) | 評論 (0)編輯 收藏

    字體大小: 正文
    交換兩個變量的值,不使用第三個變量(2009-09-16 18:19:18)
     
    通常我們的做法是(尤其是在學習階段):定義一個新的變量,借助它完成交換。代碼如下:
    int a,b;
    a=10; b=15;
    int t;
    t=a; a=b; b=t;
    這種算法易于理解,特別適合幫助初學者了解計算機程序的特點,是賦值語句的經典應用。在實際軟件開發當中,此算法簡單明了,不會產生歧義,便于程序員之間的交流,一般情況下碰到交換變量值的問題,都應采用此算法(以下稱為標準算法)。

    上面的算法最大的缺點就是需要借助一個臨時變量。那么不借助臨時變量可以實現交換嗎?答案是肯定的!這里我們可以用三種算法來實現:1)算術運算;2)指針地址操作;3)位運算。

    1) 算術運算
    簡單來說,就是通過普通的+和-運算來實現。代碼如下:
    int a,b;
    a=10;b=12;
    a=b-a; //a=2;b=12
    b=b-a; //a=2;b=10
    a=b+a; //a=10;b=10
    通過以上運算,a和b中的值就進行了交換。表面上看起來很簡單,但是不容易想到,尤其是在習慣標準算法之后。
    它的原理是:把a、b看做數軸上的點,圍繞兩點間的距離來進行計算。
    具體過程:第一句“a=b-a”求出ab兩點的距離,并且將其保存在a中;第二句“b=b-a”求出a到原點的距離(b到原點的距離與ab兩點距離之差),并且將其保存在b中;第三句“a=b+a”求出b到原點的距離(a到原點距離與ab兩點距離之和),并且將其保存在a中。完成交換。
    此算法與標準算法相比,多了三個計算的過程,但是沒有借助臨時變量。(以下稱為算術算法)

    2) 指針地址操作
    因為對地址的操作實際上進行的是整數運算,比如:兩個地址相減得到一個整數,表示兩個變量在內存中的儲存位置隔了多少個字節;地址和一個整數相加即“a+10”表示以a為基地址的在a后10個a類數據單元的地址。所以理論上可以通過和算術算法類似的運算來完成地址的交換,從而達到交換變量的目的。即:
    int *a,*b; //假設
    *a=new int(10);
    *b=new int(20); //&a=0x00001000h,&b=0x00001200h
    a=(int*)(b-a); //&a=0x00000200h,&b=0x00001200h
    b=(int*)(b-a); //&a=0x00000200h,&b=0x00001000h
    a=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h
    通過以上運算a、b的地址真的已經完成了交換,且a指向了原先b指向的值,b指向原先a指向的值了嗎?上面的代碼可以通過編譯,但是執行結果卻令人匪夷所思!原因何在?
    首先必須了解,操作系統把內存分為幾個區域:系統代碼/數據區、應用程序代碼/數據區、堆棧區、全局數據區等等。在編譯源程序時,常量、全局變量等都放入全局數據區,局部變量、動態變量則放入堆棧區。這樣當算法執行到“a=(int*)(b-a)”時,a的值并不是0x00000200h,而是要加上變量a所在內存區的基地址,實際的結果是:0x008f0200h,其中0x008f即為基地址,0200即為a在該內存區的位移。它是由編譯器自動添加的。因此導致以后的地址計算均不正確,使得a,b指向所在區的其他內存單元。再次,地址運算不能出現負數,即當a的地址大于b的地址時,b-a<0,系統自動采用補碼的形式表示負的位移,由此會產生錯誤,導致與前面同樣的結果。
    有辦法解決嗎?當然!以下是改進的算法:
    if(a<b)
    {
    a=(int*)(b-a);
    b=(int*)(b-(int(a)&0x0000ffff));
    a=(int*)(b+(int(a)&0x0000ffff));
    }
    else
    {
    b=(int*)(a-b);
    a=(int*)(a-(int(b)&0x0000ffff));
    b=(int*)(a+(int(b)&0x0000ffff));
    }
    算法做的最大改進就是采用位運算中的與運算“int(a)&0x0000ffff”,因為地址中高16位為段地址,后16位為位移地址,將它和0x0000ffff進行與運算后,段地址被屏蔽,只保留位移地址。這樣就原始算法吻合,從而得到正確的結果。
    此算法同樣沒有使用第三變量就完成了值的交換,與算術算法比較它顯得不好理解,但是它有它的優點即在交換很大的數據類型時,它的執行速度比算術算法快。因為它交換的時地址,而變量值在內存中是沒有移動過的。(以下稱為地址算法)

    3) 位運算
    通過異或運算也能實現變量的交換,這也許是最為神奇的,請看以下代碼:
    int a=10,b=12; //a=1010^b=1100;
    a=a^b; //a=0110^b=1100;
    b=a^b; //a=0110^b=1010;
    a=a^b; //a=1100=12;b=1010;
    此算法能夠實現是由異或運算的特點決定的,通過異或運算能夠使數據中的某些位翻轉,其他位不變。這就意味著任意一個數與任意一個給定的值連續異或兩次,值不變。
    即:a^b^b=a。將a=a^b代入b=a^b則得b=a^b^b=a;同理可以得到a=b^a^a=b;輕松完成交換。

    以上三個算法均實現了不借助其他變量來完成兩個變量值的交換,相比較而言算術算法和位算法計算量相當,地址算法中計算較復雜,卻可以很輕松的實現大類型(比如自定義的類或結構)的交換,而前兩種只能進行整形數據的交換(理論上重載“^”運算符,也可以實現任意結構的交換)。

    介紹這三種算法并不是要應用到實踐當中,而是為了探討技術,展示程序設計的魅力。從中可以看出,數學中的小技巧對程序設計而言具有相當的影響力,運用得當會有意想不到的神奇效果。而從實際的軟件開發看,標準算法無疑是最好的,能夠解決任意類型的交換問題
    posted @ 2009-12-02 14:55 小菜毛毛 閱讀(7548) | 評論 (0)編輯 收藏

         摘要: 轉載自:http://www.ibm.com/developerworks/cn/java/j-drools/ 使用聲明性編程方法編寫程序的業務邏輯 ...  閱讀全文
    posted @ 2009-11-28 14:36 小菜毛毛 閱讀(1658) | 評論 (1)編輯 收藏

    第一章 介紹與導覽




    本文描述Weblogic Server的域以及如何配置域。域是WebLogic Server的基本管理單元。一個域可以包括一個或多個WebLogic Server實例以及相關資源,只需使用一個Administration Server進行管理。




    以下章節描述該指南的內容與結構——理解域配置。

    文檔范圍與讀者

    文檔向導

    相關文檔

    示例與指南

    該發布版本中新的域特性




    文檔范圍與讀者




    文檔主要適用于基于一個或多個Weblogic server域開發和部署Web應用的J2EE系統架構師、應用開發人員和系統管理員。




    文檔的主題僅和軟件項目的設計與開發階段相關,不涉及產品過程管理、監控或者性能調整。對于這些主題的WebLogic Server文檔和資源鏈接,參見“相關文檔”。




    文檔假定讀者熟悉J2EE,XML的基本概念以及應用管理的一般概念。




    文檔向導

    本章“介紹與導覽”,介紹該指南的目的、結構和上下文關系。

    第二章“理解WebLogic Server域”介紹Weblogic Server域。

    第三章“使用WebLogic工具配置域”,展示你可以用來修改域配置的幾種工具。

    第四章“域配置文件”描述維護域和域的內容的磁盤表現形式的配置與目錄。

    第五章“管理配置變更”描述如何變更Weblogic Server的管理特性。




    相關文檔

    關于用于創建和配置Weblogic Server域的工具的更多信息,參見:

    使用配置向導創建WebLogic域

    WebLogic腳本工具

    使用JMX部署可管理的應用

    WebLogic Server命令參考

    管理控制臺在線幫助

    關于其他系統管理任務的信息,參見系統管理文檔,尤其是:

    設計和配置WebLogic Server環境

    使用WebLogic Server集群




    示例和向導

    BEA系統公司為本文檔提供了和域配置、管理相關的以下代碼示例和指南:

    BEA WebLogic Server的示例安裝(可選)于目錄WL_HOME/samples/server/examples/src/examples,WL_HOME是你安裝WebLogic Server的頂級目錄,這些示例也可以通過Windows開始菜單使用。集群示例會在BEA WebLogic Server集群指南示例中描述,指導你掌握使用WebLogic配置向導和管理控制臺來創建和配置一個新的server實例集群的整個過程。




    本版中新的域特性

    Weblogic Server 9.0在Weblogic Server域配置中引入了幾項重要變化:

    config.xml的XML Schema

    域目錄結構

    配置變更管理




    config.xml的XML Schema

    WebLogic Server域和實例配置的磁盤表現形式在本版本中有所不同。在原版本中,配置信息被保存在單個XML倉庫文件config.xml中,默認位于user_projects/domains/domain_name目錄下。在本版的WebLogic Server中,config.xml文件符合XML Schema定義(用來驗證域配置文件格式的有效性)。而且,config.xml融合了其他配置文件(符合各自的XML Schema)的配置信息。在本版中,config.xml默認位于user_projects/domains/domain_name/config目錄下,config.xml核心文件涉及的輔助配置文件位于user_projects/domains/domain_name/config目錄的子目錄中。更多信息,參見第四章“域配置文件”。




    域目錄結構

    本版中,Weblogic Server域在磁盤上的目錄結構有了改變。域的父目錄命名為domains。域的配置信息保存在domains/domain_name/config目錄和config目錄的子目錄中。更多信息,參見“域目錄內容”。




    配置變更管理

    WebLogic Server提供了一些新特性用來管理服務配置變更,這使你可以安全、可預知地實現分發某個域的配置變更。當然這要求你在使用控制臺進行配置變更前獲得管理員控制臺鎖。




    WebLogic Server中的變更管理過程和數據庫事務有些類似。由管理服務器維護一個獨立的,可編輯的域配置表現形式,稱為編輯層。server實例并不涉及編輯層。相反,server實例使用只讀層來發現配置。為了開啟編輯過程,你應當可以獲得一個編輯層的鎖以防止其他人更改。當你完成更改后,你保存并將其分發至域中的所有server實例。分發完成后,每一個server來決定自己是否接受該變更。一旦所有的server都接受該變更,則更新運行的配置層,變更才完成。




    現在的管理控制臺包括一個名為Change Center(變更中心)的區域。當你使用管理控制臺進行配置變更時,你必須首先通過點擊Change Center的Lock & Make Changes(鎖且變更)獲得鎖。進行期望的配置變更以后,然后可以在Change Center:

    點擊Activate Changes(激活變更)接受更改,向域中的sever實例分發,或者

    點擊Undo All Changes(撤銷所有變更),釋放鎖。

    WebLogic Server一般采用相同方式控制配置變更,無論變更是使用管理控制臺實現,還是WebLogic 腳本工具、配置管理服務或者JMX API。

    更多信息,參見第五章“管理配置變更”。




    第二章 理解Weblogic Server域

    以下章節介紹Weblogic Server域和域的內容:

    域是什么

    組織域

    域的內容

    域約束




    域是什么?

    一個Weblogic Server管理域是邏輯上相關的Weblogic Server資源組。域包括一個特殊的Weblogic Server實例,叫做管理服務器(Administration Server),這是你配置和管理域的所有資源的關鍵。通常,你配置的一個域會加入另外的WebLogic Server實例,叫作托管服務器(Managed Server)。你的Web應用、EJB和其他資源會部署在托管服務器上,而管理服務器只是用于配置和管理。




    多個托管服務器可以組織成集群(clusters),這使你能夠保持負載平衡和對于臨界的應用提供失敗保護,同時只使用一個管理服務器會使托管服務器實例的管理變得簡單。




    組織域




    如何將WebLogic Server裝置組織成域,這取決于你的業務需求。你可以基于系統管理員職責、應用邊界或者server運行的地理位置的不同定義多個域。與之相反,你也可以決定將所有WebLogic Server管理行為集中于一個域。




    根據你特定的業務需求和系統管理實際,你可以按照如下標準決定如何組織你的域:




    應用的邏輯區分。比如,你可以有一個域用于類似購物車的終端用戶功能,另一個域用于后臺記賬。

    物理位置。你可以為業務的不同地理位置和分支分別建域。

    大小。你會發現域被組織成更小的單元可能會使不同的系統管理員管理效率更高。反之,你也會發現維護單個域或者少量的域,配置更容易保持一致。




    一個域由一個管理服務器和一個或多個托管服務器組成,也可以只由單個孤立的server組成,既扮演管理服務器的角色又駐留應用。




    由分散的托管服務器組成的域:簡單的產品環境由幾個駐留應用的托管服務器,一個執行管理操作的管理服務器組成。在這種配置下,應用和資源部署在各自的托管服務器中;類似地,訪問應用的客戶端與各自的托管服務器連接。




    如果產品環境對增強應用性能、吞吐量或者可用性有要求,那么應該將兩個或者更多的托管服務器配置成集群。機群允許多個托管服務器作為單個個體駐留應用和資源。關于在孤立的和集群托管服務器之間差異的更多信息,參見“托管服務器和托管服務器集群”。

    孤立的server域:對于開發或測試環境而言,你可能想在部署單個應用和server獨立于產品域中的server。這種情況下,你可以部署一個簡單域,只由單個server實例組成,既作為管理服務器,又駐留你開發的應用。你用WebLogic Server安裝的wl_server域就是一個孤立server域的例子。

    注意:在產品環境中,BEA建議你只在域中的托管服務器部署應用,管理服務器應當只負責管理任務。




    域的內容



    盡管域的范圍與目的會有很大差異,但是大多數 WebLogic Server域都包含本章節中描述的組件。




    下圖展示了產品環境,包括一個管理服務器,三個孤立的托管服務器和三個托管服務器組成的集群。



    管理服務器

    每個Weblogic Server域都必須有一個server實例作為管理服務器。你使用管理服務器(編程或者通過管理服務器)來配置域中的所有其他server實例和資源。




    管理服務器的角色




    在啟動域的托管服務器之前,應先啟動管理服務器。當你啟動一個孤立或集群托管服務器時,它會按配置信息與管理服務器相聯。這種方式下,管理服務器在整個域配置中充當核心控制體。




    當管理服務器啟動時,加載域的config.xml文件,除非你在創建域時指定另一個目錄存儲config.xml。




    BEA_HOME/user_projects/domains/mydomain/config




    這里mydomain是特定域的目錄,名稱與域相同。config.xml引用的其他配置文件,位于域的config目錄的子目錄下。




    管理服務器每一次成功啟動后,將在域目錄中創建一份命名為config-booted.jar的備份配置文件。萬一配置文件在server實例生命周期內有損壞,有可能恢復原先的配置。




    如果管理服務器出錯會發生什么?




    域的管理服務器出錯不會影響域中的托管服務器的操作。如果域的管理服務器變得不可用,而它所管理的server實例——集群或者其他方式——仍在運行,那么那些托管服務器將繼續運行。如果該域包含集群server實例,那么由域配置支持的負載平衡和失敗性能保持可用,即使管理服務器出錯。如果域的管理服務器停止運行而托管服務器繼續運行,那么每一個托管服務器會周期性地嘗試重新連接管理服務器,周期由ServerMBean屬性AdminReconnectIntervalSecs指定。AdminReconnectIntervalSecs默認為10秒。




    如果管理服務器因為主機的硬件或軟件錯誤而失敗,同一臺機器的其它server實例都可能受到同樣的影響。然而,管理服務器自身的失敗不會中斷域的托管服務器的運行。而且即使管理服務器不在運行狀態,你也可以啟動托管服務器。這種情況下,托管服務器使用配置文件的本地拷貝來作為它的啟動配置,然后周期性地向管理服務器作連接嘗試,連接后利用管理服務器來同步配置狀態。




    對于重啟管理服務器的指令,參見“管理服務器啟動與關閉”。







    托管服務器和托管服務器集群




    在域中,非管理服務器的server實例,指向托管服務器。托管服務器駐留構成你應用的組件和相關資源,比如JSP和EJB。當某個托管服務器啟動后,它會連接域的管理服務器來獲得配置和部署設置。




    注意:即使管理服務器不可用,域中的托管服務器也可以獨立于管理服務器啟動。更多信息參見“管理server啟動與關閉”中的“避免server失敗與恢復”。

    兩個或更多的托管服務器可以配置成一個WebLogic Server集群,來增加應用的可伸縮性與可用性。在WebLogic Server集群中,大多數資源與服務平均部署給每一個托管服務器(與單個托管服務器相反),來使失敗與負載平衡。要想了解哪種組件類型和服務可以進行集群(部署給集群中的所有server實例),參見“使用WebLogic Server集群”中的“理解WebLogic Server集群”。

    你可以創建一個非集群的托管服務器,然后通過配置有關server實例和集群的參數將其加入集群。你也可以通過重新配置參數從集群中刪除某個托管服務器。在集群與非集群托管服務器之間的根本區別在于對失敗和負載平衡的支持。這些特性僅在集群托管服務器中可用。

    你對于可伸縮性與可靠性的要求將決定你是否采用集群托管服務器。比如,如果你的應用不常遇到易變的加載,應用服務中可能的中斷也是可以接受的,那么就沒有必要采用集群。

    關于WebLogic Server集群的好處與性能的更多信息,參見“使用WebLogic Server集群”中的“理解WebLogic Server集群”。單個域可以包含多個WebLogic Server集群,同樣多個托管服務器也可以不被配置成集群。




    資源與服務




    除了管理服務器和托管服務器之外,域還包括托管服務器所需的資源和服務及部署在該域上的應用。




    域配置包括域運行的網絡計算機環境信息,比如:

    機器定位依靠硬件上某個特定的物理片段來識別。機器定位被用來關聯駐留托管服務器的計算機。該信息由節點管理器(Node Manager)重啟一臺出錯的托管服務器,集群的托管服務器選擇存儲重復的會話數據的最好位置時使用。關于節點管理器的更多信息,參見“設計與配置WebLogic Server環境”的“使用節點管理器控制服務器”。

    網絡通道,一個可以用來定義默認端口、協議和協議設置的可選資源。在創建一個網絡通道后,可以將它分配給域中任意一個托管服務器和集群。更多信息,參見“設計與配置WebLogic Server環境”中的“配置網絡資源”。

    域配置還包括與駐留在域中應用相關的資源和服務信息。這些資源和服務的例子包括:

    應用組件,比如EJB

    連接器

    JDBC連接池

    JMS server

    啟動類

    資源和服務可能被限制于域中一個或多個托管服務器,而不是對于整個域可用。你可以選擇托管服務器或者集群進行部署資源與服務。




    域約束




    WebLogic Server環境可以由單個域組成,包括駐留應用所需的所有托管服務器,也可以是多個域。你可以選擇創建多個域,根據組織單元、系統管理員職責、應用邊界或者其它要考慮的事項來劃分。在設計域配置時,注意以下約束:




    每一個域都需要自身的管理服務器執行管理操作。當你使用管理控制臺執行管理和監控任務時,你可以在域中來回切換,同時你會連接不同的管理服務器。

    同一個集群中的所有托管服務器必須位于相同的域,你不能將集群拆分至多個域。

    同一個域中的所有托管服務器運行的WebLogic Server軟件版本必須相同。域中的管理服務器可以和托管服務器運行相同的版本,也可以是更新的版本。

    你不能在域中共享配置資源與子系統。比如,如果你在一個域中創建了一個JDBC連接池,你就不可能在另一個域中的托管服務器或集群中使用。代之,你必須在第二個域中創建一個類似的連接池。




    第三章 使用Weblogic工具配置域

    WebLogic包括了你可以用來創建、修改或者復制域配置的一系列工具。包括以下工具:

    域配置向導——域配置向導是創建一個新的域或集群的推薦工具。關于使用域配置向導的更多信息,參見“使用配置向導創建WebLogic域”。

    WebLogic Server管理控制臺——管理控制臺是管理服務器的圖形化用戶界面(GUI)。管理控制臺描述參見“管理控制臺在線幫助”。

    WebLogic腳本工具(WLST)——你可以使用命令行腳本接口來創建、管理和維護WebLogic Server配置變更。WebLogic腳本工具描述參見“WebLogic腳本工具”。

    WebLogic Server應用編程接口(API)—— 你可以使用WebLogic Server提供的API編寫程序修改配置屬性。JMX API描述參見“使用JMX開發可管理的應用”。

    WebLogic Server命令行工具——該工具允許你創建腳本來自動進行域管理。關于該工具的更多信息,參見“WebLogic Server命令參考”。




    對于大多數方式而言,要修改域配置域的管理服務器必須運行。然而,你如果使用 WLST 來進行域配置變更不需要運行管理服務器。這種情況下,WLST造成的變更也不會立即生效直到管理服務器和托管服務器重啟。




    第四章 域配置文件





    本章節描述如何在文件系統中表示域。它包括以下部分:

    配置文件概覽

    config.xml

    域域目錄概覽

    域目錄內容

    域配置文件概覽

    WebLogic Server管理和配置服務通過Java管理擴展(JMX)API來訪問。域的配置保存在域目錄下的配置目錄中。這些配置目錄中的文件用來持久化存儲WebLogic Server在使用JMX API運行期間創建和修改的托管對象。config.xml的目的是存儲托管配置對象的變更以使得WebLogic Server重啟時可以訪問。

    域的核心配置文件為domain_name/config/config.xml文件。它指定域的名稱和域中每一個server實例、集群、資源和服務的配置參數。域的一些主要子系統配置保存在domain_name/config目錄的子目錄中。

    域目錄還包括你用來啟動域的管理服務器和托管服務器的默認腳本文件。




    config.xml

    域的核心配置文件為/domains/domain_name/config/config.xml文件。它指定域的名稱和域中每一個server實例、集群、資源與服務的配置參數。

    config.xml文件符合XML Schema,URL為 http://www.bea.com/ns/weblogic/config。schema位于文件系統中的JAR文件BEA_HOME/weblogic90/server/lib/schema/configuration-binding.jar中,即META-INF/schemas/schema-0.xsd。XML編輯工具可以使用XML Schema來修改和驗證config.xml文件。




    編輯配置文件

    大多數情況下,你不應該直接修改config.xml或其他配置文件,而應該使用管理控制臺或者用第三章“使用WebLogic工具配置域”中列出的某個工具來修改域配置。配置變更將會映射到配置文件中。

    如果你選擇放置配置文件,安裝的其他組件在源控制之下(使用WLST管理),直接修改配置文件可能是合適的。

    警告:當WebLogic Server運行時你不能編輯配置文件,因為WebLogic Server會周期性地重寫該文件。你的更改將會丟失,也可能造成WebLogic Server失敗,這取決于你的平臺。

    WebLogic Server配置文件是格式友好的XML文件,因此它有可能使用XML解析應用比如 Apache Xerces, or JDOM來使某個重復性的變更腳本實現。

    確保完整測試所創建的腳本,在作變更之前對每一個配置文件作備份性拷貝。

    輔助配置文件

    在原版本中,config.xml文件存放了所有配置信息。新版本中,幾個WebLogic Server子系統被配置在輔助配置文件中,由核心的config.xml來引用。這些輔助配置文件位于/domains/domain_name/config目錄的子目錄中。關于輔助配置文件的更多信息,參見“域目錄概覽”和“域目錄內容”。

    配置文件壓縮包

    WebLogic Server對配置文件作備份拷貝。萬一配置變更需要推倒重來或者配置文件被破壞(當然這種情況不太可能),這使得恢復很容易。當管理服務器啟動時,它將配置文件保存在一個命名為config-booted.jar的JAR文件中。當你變更配置文件時,舊文件以JAR文件的形式保存在域目錄下的configArchive目錄中,命名帶數字序列,比如config-1.jar。

    域目錄概覽

    圖4-1是域目錄樹型結構的概覽。 domain-name 、deployment-name和server-name目錄名稱不是字面所示,實際上替換成任何指定的名稱都是可以的;其他的目錄名稱則是字面所示。概覽只顯示目錄,不含目錄內的文件。任何實際的特定域目錄樹,整個結構都可能不會是這樣。



    域目錄內容




    本節描述域目錄和子目錄的內容,以斜體表示的目錄名稱不是實際的名稱,而是要以適當的具體名稱來替代,非斜體的名稱則是字面上所示的名稱。

    domain-name

    該目錄的名稱為域的名稱。




    applications




    該目錄提供了一種在部署服務器上部署應用的快速方式。當Weblogic Server實例以開發模式運行時,它會自動部署你放置在該目錄的任何應用與模塊。




    你放置在目錄的文件可以是:

    一個J2EE應用

    一個EAR文件

    一個WAR、EJB JAR、RAR或者CAR的壓縮模塊

    一個應用或者一個模塊的解壓目錄

    bin

    該目錄包括了一些用來啟動或終止域中的管理服務器和托管服務器進程的腳本。它也可以包括一些其他廣義上的域腳本,比如啟動和終止數據庫管理系統、全文檢索引擎進程等的腳本。更多信息,參見管理server啟動和終止。




    config

    該目錄包含域的當前配置和部署狀態,核心域配置文件config.xml即位于本目錄中。




    config/deployments

    保存域部署應用的目錄。

    config/deployments/library_modules

    保存類庫模塊的目錄,也就是說,該目錄中的任何文件都將以類庫模塊自動注冊。

    config/deployments/deployment-name-1

    該目錄包含一個應用或者可發布的模塊。它所含的子級目錄可以包含一個壓縮文件(EAR或WAR),一個部署清單,擴展描述符等等。

    config/diagnostics

    該目錄包含WebLogic診斷服務(WebLogic Diagnostic Service)系統模塊。更多信息,參見“理解WebLogic診斷服務”。

    config/jdbc

    該目錄包含JDBC系統模塊:所有JDBC模塊都可以通過JMX直接配置(和JSR-88不同)。更多信息,參見“數據庫連接(JDBC)”。

    config/jms

    該目錄包含JMS系統模塊:所有JMS模塊都可以通過JMX直接配置。更多信息,參見“消息與數據庫連接(JDBC)”。

    config/nodemanager

    該目錄保存與節點管理器連接的的配置信息。更多信息,參見“設計與配置WebLogic Server環境”中的“使用節點管理器管理服務”。

    config/security

    該目錄包含安全框架系統模塊。包含了當前域的每一種安全供應器的安全供應器配置擴展。更多信息,參見理解“WebLogic 安全”。

    config/startup

    該目錄包含含啟動計劃的系統模塊。啟動計劃被用來生成shell腳本,作為server啟動的一部分。

    configArchive

    該目錄包含一組用于保存域配置狀態的JAR文件。在未決的配置變更激活前,域的當前配置狀態,包括config.xml文件和其他相關文件,保存在帶版本號的JAR文件中,命名成config.jar#1,config.jar#2等等。

    帶版本號的JAR文件的最大數量由DomainMBean的archiveConfigurationCount屬性指定。一旦達到最大數,在新版本創建之前刪除最舊的版本。

    lib

    放置在該目錄中的任何JAR文件在sever的Java虛擬機啟動時都會添加至域中每一個server實例的系統classpath。

    pending

    該目錄包含的域配置文件表示已請求,但還沒有激活的配置變更。一旦配置變更被激活,該目錄中的配置文件將被刪除。更多信息,參見“管理配置變更”。

    security

    該目錄保存的安全相關文件對于域中的每一個WebLogic Server實例來說都是相同的。

    SerializedSystemIni.dat

    該目錄還保存只有域管理服務器需要的安全相關文件:

    DefaultAuthorizerInit.ldift

    DefaultAuthenticatorInit.ldift

    DefaultRoleMapperInit.ldift

    更多信息,參見“理解WebLogic安全”。

    servers

    該目錄為域中每一個WebLogic Server實例設置一個子目錄。

    servers/server-name

    該目錄為server目錄,名稱和WebLogic Server實例的名稱相同。

    servers/server-name/bin

    該目錄存放可執行的或shell文件,對于不同的server可能會不同。server環境腳本(setServerEnv.sh或setServerEnv.cmd)是位于此處的一個文件示例,因為它能區分一個WebLogic Server實例與下一個實例的不同,這取決于server實例是否有自己的啟動計劃。

    servers/server-name/cache

    該目錄存放包含緩存數據的目錄和文件。這里“緩存(cached)”表示該數據是其他數據的拷貝,可能是進程中的形式(已編譯,已翻譯或重新格式化的)。

    servers/server-name/cache/EJBCompilerCache

    該目錄為已編譯的EJB緩存。

    servers/server-name/data

    和臨時的、緩存的或者歷史信息相反,該目錄存放的文件維護持久化的預服務狀態,而不是安全狀態,用于運行WebLogic Server實例。該目錄中的文件非常重要,必須存在于WebLogic Server實例開始,停止,崩潰,重啟或升級至新版本的整個過程中。

    servers/server-name/data/ldap

    該目錄存放內嵌的LDAP數據庫。WebLogic Server實例的運行時安全狀態持久化于該目錄。

    servers/server-name/data/store

    該目錄存放JMS持久化存儲。對于每一個持久化存儲,都有一個子目錄存放表示持久化存儲的文件。子目錄的名稱為持久化存儲的名稱。照例有一個存儲命名為default。

    servers/server-name/logs

    該目錄存放日志和診斷信息。實際上只是一些歷史信息,對于server的運行并非至關重要,可以刪除(不過至少WebLogic Server實例應該終止)而不影響正確的運行。然而,這些信息對于調試和檢查相當有用,如果沒有好的理由不應當刪除。

    servers/server-name/logs/diagnostic_images

    該目錄存放WebLogic診斷服務(WebLogic Diagnostic Service)的Server圖片捕獲器(Server Image Capture)組件創建的信息。更多信息,參見“理解WebLogic診斷服務”。

    servers/server-name/logs/jmsServers

    該目錄為WebLogic Server實例中的每一個JMS服務提供一個子目錄。每一個那樣的子目錄包含JMS服務的日志。子目錄的名稱為JMS服務的名稱。

    servers/server-name/logs/connector

    該目錄是連接器模塊(JCA資源適配器)日志的默認基目錄。

    servers/server-name/security

    該目錄存放安全相關文件,每一個WebLogic Server實例都可能不同。文件boot.properties是位于此處的一個文件示例,因為它能區分一個server實例與下一個實例的不同。該目錄還維護與SSL key相關的文件。

    servers/server-name/tmp

    該目錄存放server實例運行時創建的臨時目錄與文件。server運行時該目錄中的文件應當保留,但可以在server實例終止后隨意刪除。




    第五章 管理配置變更

    為了提供一個安全、可預期的方式來分發域的配置變更,WebLogic Server采用了大致類似于數據庫事務的變更管理進程。域的配置在文件系統中表示為一組XML配置文件,核心為config.xml文件,在運行時表示為配置MBean(Configuration MBeans)樹。當你編輯域配置時,你實際上編輯的是分離的管理服務器的配置MBeans樹。要開始編輯過程,你應獲得編輯樹的鎖以阻止其他人進行變更。完成變更后,保存變更。不過變更不會生效直到你激活它們,分發給域中的所有server實例。激活變更后,每一個server都決定是否接受變更。如果所有server都可以接受該變更,則更新運行著的配置層,變更完成。




    注意WebLogic Server的變更管理過程適用于域的變更和server配置數據,不適用于安全或應用數據。

    關于如何通過JMX和配置MBean來實現配置變更的更多詳細信息,參見“使用JMX開發可管理的應用”中的“理解WebLogic Server MBeans”

    如第三章“使用WebLogic工具配置域”中的描述,你可以使用一系列不同的WebLogic Server工具進行配置變更:

    管理控制臺

    WebLogic 腳本工具

    JMX API

    無論你使用哪一個工具進行配置變更,WebLogic Server都采用大體相同的方式來處理變更過程。

    以下章節描述配置變更管理:

    管理控制臺的變更管理

    配置變更管理過程

    配置管理狀態圖

    管理控制臺的變更管理

    WebLogic管理控制臺將配置變更管理過程集中于Change Center:



    如果你想使用管理控制臺進行配置變更,你必須先點擊Change Center中的Lock & Edit(鎖定并編輯)按鈕。當你點擊Lock & Edit后,你會獲得域中所有server的配置MBean的可編輯層(編輯樹)的鎖。

    在你使用管理控制臺進行配置變更后,在適當的頁面點擊Save(保存)(某些情況下為Finish(完成)),這些不會使變更立即生效,而是在你點擊Save時,將變更保存至編輯樹,domain-name/pending/config.xml文件和相關的配置文件。只有在你點擊Change Center的Activate Changes(激活變更)時變更才會生效,此時,配置變更分發至域中的每一個server。只有每一個server都接受該變更,變更才會生效。如果有任何server不接受該變更,那么域中的所有server的所有變更全部回滾。變更保持為未決狀態,你既可以編輯該未決變更以解決問題或者恢復未決變更。

    配置變更管理過程

    以下步驟詳細描述該過程,從你首先導入域的管理服務器開始:

    1.服務器啟動時讀取域配置文件,包括config.xml文件和config.xml文件涉及的所有附屬配置文件,使用這些數據對隨后的MBean樹進行實例化:

    –一個配置 MBean的只讀樹包含管理服務器的當前資源配置。

    –域中所有服務器的所有配置 MBean的可編輯樹。

    注意:管理服務器也會實例化一個運行時MBean樹和一個域運行時MBean樹,但是這些不用于配置管理。

    2. 按以下步驟開始配置變更:

    a. 獲得當前配置鎖。

    b. 使用你選擇的工具(管理控制臺,WLST,JMX API等),按你的要求變更。

    c. 將變更保存至config.xml文件的未決版本。

    3. 配置管理器服務將來自編輯MBean樹的所有數據保存成一份獨立的配置文件,目錄名為pending。參見圖5-2。

    pending目錄直接位于域的根目錄下。比如說,如果你的域命名為mydomain,那么未決的config.xml文件的默認路徑名為mydomain/pending/config.xml。



    4. 進行其它變更或者取消已做出的變更。

    5. 當你準備激活域的變更時,使用管理控制臺Change Center的Activate Changes按鈕或者使用ConfigurationManagerMBean。

    激活變更(參見圖 5-3):

    a. 對于域的每一個server實例,配置管理器服務將未決配置文件拷貝至server的根目錄下的pending目錄。

    如果托管服務器和管理服務器共享根目錄,ConfigurationManagerMBean不必拷貝未決的配置文件,托管服務器直接使用管理服務器的未決文件。

    b. 每一個server實例將它的當前配置和未決文件中的配置進行比較。

    c. 每一個server內部的子系統將對自身是否能接受新配置進行投票。

    只有要任一子系統表示它不能接受該變更,整個的激活過程將回滾,ConfigurationManagerMBean拋出異常。你可以修改變更,再次進行變更激活,或者放棄鎖,編輯配置MBean樹和未決配置文件恢復至只讀配置MBean樹和配置文件的配置。

    d. 如果所有server的所有子系統都能接受該變更,配置管理器服務將域的每一個server實例的只讀配置文件替換成未決配置文件。

    e. 每一個server實例都會更新bean和只讀配置MBean樹以和新的配置文件的變更保持一致。

    f. 然后未決配置文件從pending目錄中刪除。

    6. 你可以保持鎖以進行其它的變更或者釋放鎖以使其他人可以更新配置。你也可以設置超時時限使配置管理器服務放棄鎖。

    注意:配置變更鎖不會防止你在使用相同的管理員賬號造成的配置編輯沖突。比如,如果你使用管理控制臺獲得配置變更鎖,然后以相同的用戶帳號使用WebLogic腳本工具,你將訪問的是在管理控制臺中打開的相同的編輯會話,你不會因為使用腳本工具而被鎖定。由于這可能造成配置變更的混亂和沖突,這不是一種受推薦的手段。你應該通過為每一個管理員身份的用戶維護一個獨立的管理員賬號來減少發生這種情況是造成的風險。不過如果你有使用相同的用戶帳號的多個相同腳本實例,相同的問題仍然會發生,



    處理變更沖突

    這種情況,你保存的多個變更沒有被激活,某個變更會使前一個變更無效,變更管理器服務需要你在保存變更前手動解決該無效問題。




    配置管理狀態圖




    配置管理服務遵循圖 5-4中描述的狀態轉換。

     

    posted @ 2009-11-25 22:17 小菜毛毛 閱讀(2694) | 評論 (0)編輯 收藏

    SVN客戶端用戶使用手冊(完整版)
    該文檔將逐步教您如何在軟件開發過程中使用svn客戶端
    環境模擬
    現有項目名稱:test
    服務端版本庫:test
    URL:http://10.155.11.10:81/svn
    開發人員:devA,devB
    版本庫目錄結構:
     
    一.基本操作
    第一步:安裝客戶端
    到共享文件夾下,下載TortoiseSVN-1.4.0.7501-win32-svn-1.4.0.msi安裝程序,雙擊直接安裝即可。安裝成功后,右鍵單擊鼠標會多出兩個選項,分別是SVN checkout和Tortoise SVN。
    第二步:建立工作區
    項目開始之前,在本地PC的硬盤上,創建一個文件夾,文件夾命名隨意(例如workspace
    ),該文件夾即作為軟件開發者在項目開發過程中的工作區。
    第三步:下載版本庫
        假如現在開發一個項目,配置管理員會在服務端建立一個該項目的版本庫test
    在workspace文件夾上,右鍵單擊鼠標。選擇SVN checkout,會出現如下窗口
     
    在URL of repository中輸入版本庫地址,http://10.155.11.10:81/svn/test ,在Checkout dir中系統會自動添加第二步所創建的工作區目錄。
    在Revision中,選中HEAD revision,這樣將會下載到版本庫的最新版本。如果想下載庫中的舊版本文件,可選中Revision,然后填入版本號即可。
    如果不想下載整個版本庫,而是只想下載自己負責的那部分模塊,可以在URL后添加模塊名,例如http://10.155.11.10:81/svn/test/Doc 。
    單擊OK,輸入用戶名和密碼
    第四步:修改版本庫
    對版本庫的修改包括修改文件內容,添加刪除文件,添加刪除目錄。
    經過第三步的操作,本地的工作區文件夾,即workspace上會有綠色對勾出現,工作區下的文件也會帶有綠色對勾,如圖2
     
    如果對庫中某一個文件進行了修改,系統會自動為這個文件和這個文件所在的各級父文件夾加上紅色嘆號,代表該文件或目錄已經在本地被修改,如圖3
     
    圖3
    當所有對版本庫的修改操作完畢后,右鍵單擊工作區文件夾,選擇commit提交新版本,輸入密碼后系統將把修改后的版本庫上傳到服務端,即完成一次對版本庫的更新。
    注意:
    新版本提交之后,其他擁有寫權限的用戶也許會重復以上幾步的操作,完成對版本庫的再一次更新。所以,每次在工作區文件夾下修改本地版本庫之前,必須首先對本地版本庫執行一次更新(右鍵單擊工作區,選擇SVN Updata),將最新的版本下載到本地,然后再進行修改操作。
    二.其他操作
    在日常的軟件開發過程中,除了以上介紹的下載,提交,更新操作外,還有另外幾種常用操作。
    (1)比較文件的不同之處
    當對soc_1做了修改之后,soc_1文件會出現紅色嘆號,表示已經修改,如果想查看修改后的soc_1文件與修改前有何不同,可以右鍵單擊此文件,選擇diff,系統探出一個窗口,如圖3,窗口分為兩個部分,左邊為更改之前的版本,右邊為更改之后的版本。并在不同之處作出標記和說明。如圖4

    如果是word文檔的話,選擇diff之后,系統會打開一個word文檔,并在其中標出修改后的版本與修改前有何不同。如圖4.1

    (2)查看日志
    如果想查看一個文件的日志,例如soc_1,右鍵單擊這個文件,選擇show log,系統會踏出一個窗口,并在窗口中顯示soc_1各個版本的log。如圖4

    圖5
    (3)查看版本樹
    如果想查看soc_1文件的版本樹,右鍵單擊該文件,選擇Revision graph,系統將會打開一個窗口,并在窗口中顯示該文件的版本樹。如圖6。

       之所以只顯示了4.5.6.7四個版本,是因為選擇了只顯示發生過變化的版本。即1.4.5.6.7每一個版本都有不同的地方,都是經過用戶修改后提交的。而2.3兩個版本是與版本1相同的。
    (4)下載某個文件的舊版本
    如果想要得到某個文件的舊版本,只需在該文件上單擊右鍵,選擇Updata to revision…即可。系統會提示輸入版本號。例如要下載soc_1的第五個版本,只需填入5即可。如圖7。查看完版本5的文件后,如果想在此回到最新版本,只需要對soc_1運行Updata即可。
     
    (5)重名名和刪除文件
    如果要刪除一個文件或重名名一個文件,
    注意不要在windows下直接操作。只需右鍵單擊該文件,選擇Rename或Delete,svn系統便會完成操作。
    在workspace中將文件重命名或刪除后,服務端的文件結構不會變化,只有當提交新版本庫后,即commit后,服務端的文件結構才會被更新。
    如果誤刪除了文件,在沒有提交版本庫之前,可以通過對版本庫的升級將文件重新下載到本地的版本庫,也可以通過revert恢復(參考第八條)。如果文件刪除,并且已經提交,那么要找回文件只能通過下載舊版本庫來完成,參考(4)。
    (6)創建分支
    版本庫中最初的文件soc_1,soc_2,word_1,word_2都是主干文件。如果想要為soc_1創建一個分支,只需右鍵單擊soc_1,選擇Branch/Tag,系統會彈出一個窗口,如圖8。在窗口中,From URL表示要創建的這個分支是soc_1的分支(系統會自動添加,不必更改)。在To URL中,需要更改一下文件名,在文件名后加一個標志即可,例如“
    _branch”,路徑不需要更改。在Creat copy in the repository from中,可以選擇分支文件是由soc_1的那一個版本拷貝來的。最后填寫日志,選擇OK。

    分支創建完畢,Updata版本庫,系統會將soc_1的主干文件和分支文件soc_1_branch同時下載到本地版本庫,如圖8.1,然后即可在分支文件上進行操作。此時soc_1的版本樹如圖8.2
     
    (7)合并分支
    當需要把soc_1_branc分支文件合并到soc_1主干文件時,右鍵單擊soc_1,選擇Merge,會彈出一個窗口,如圖9。

    在 From輸入框中填入主干的URL,在To輸入框中填入分支的URL。在From和To中,都有兩個選項HEAD Revision和Revision,表示要進行合并的是soc_1的那個版本。合并之后主干文件會標注紅色嘆號,表示已被修改,并可以提交。如果合并后文件標注的是黃色嘆號,表示文件有沖突,處理方法見第三部分“異常處理”。
    (8)撤銷修改
    當對一個文件進行了修改并保存后(注意此處并沒有進行提交),如果對修改不滿意,想要重新修改,可以右鍵單擊修改過的文件(帶紅色嘆號的那個),然后選擇revert,前面的一系列修改便會被撤銷,恢復到Updata之后的狀態。如果一個文件被誤刪除,也可通過右鍵單擊該文件所在的目錄,選擇revert來恢復。
    三.異常處理
    此處所說的異常主要是指文件發生沖突。以用戶devA和用戶devB為例,
    當兩個用戶同時下載了最新的版本庫,并對庫中同一個文件soc_2進行修改提交時,首先提交的用戶devA不會發生異常,第二個提交的用戶
    devB便會出現無法提交的現象。因為服務端的版本庫已經被devA更新,devB用戶在上傳時,系統會提示出錯如圖10。

    在這種情況下,devB用戶需要首先對修改的文件進行Updata文件操作。如果兩個用戶修改了文件soc_2的同一個地方,則在devB用戶執行Updata后,系統會將本地的soc_2與從服務端下載soc_2合并到一個文件上,并在該文件圖標上標上黃色嘆號,表示文件出沖突。在文件中通過“<<<<<<”和“>>>>>>”標識沖突位置和沖突內容。devB用戶只有與devA協商,將該沖突處理,之后單擊右鍵,選擇Resolve,沖突標記消除,才能夠再次提交,否則無法提交。
    文件標記沖突的格式:
    <<<<<<< .mine
        workspsace工作區,等abc工作區提交結束后再提交,應該會出現沖突

    =======
       在此插入一段話,啊啊aaa,測試沖突
    >>>>>>> .r15
    綠色部分表示本地文件的修改
    藍色部分表示服務端版本庫中的最新版本與本地文件修改發生沖突的地方。
    紫色表示是第15個版本發生了沖突
    =======
       在此插入一段話,啊啊aaa,測試沖突
    >>>>>>> .r15
    綠色部分表示本地文件的修改
    藍色部分表示服務端版本庫中的最新版本與本地文件修改發生沖突的地方。
    紫色表示是第15個版本發生了沖突
    文章來自[SVN中文技術網]轉發請保留本站地址:http://www.svn8.com/svnzixun/20090413/4578.html

    posted @ 2009-11-24 11:38 小菜毛毛 閱讀(652) | 評論 (0)編輯 收藏

    僅列出標題
    共17頁: First 上一頁 8 9 10 11 12 13 14 15 16 下一頁 Last 
    主站蜘蛛池模板: 亚洲成年看片在线观看| 无码国产精品一区二区免费虚拟VR | 99免费观看视频| 亚洲狠狠婷婷综合久久久久| 国产精品小视频免费无限app| 国产L精品国产亚洲区久久| 一区二区3区免费视频| 亚洲无人区午夜福利码高清完整版| 一个人看的在线免费视频| 精品亚洲成α人无码成α在线观看 | 99久久国产免费中文无字幕| 亚洲天堂久久精品| 国产成人精品久久免费动漫| 亚洲五月丁香综合视频| 日本高清免费不卡视频| 青青草国产免费国产是公开 | 国产AV无码专区亚洲精品| 午夜视频在线免费观看| 亚洲日韩中文字幕天堂不卡| 野花高清在线观看免费3中文 | 亚洲人成欧美中文字幕| 日本一道本高清免费| 国产精品偷伦视频免费观看了 | 一区二区三区在线免费看| 亚洲国产成人精品电影| 91高清免费国产自产| 亚洲国产日韩综合久久精品| 免费A级毛片无码久久版| 国产午夜精品理论片免费观看| 久久亚洲AV成人出白浆无码国产| 2021免费日韩视频网| 无套内谢孕妇毛片免费看看| 亚洲成色WWW久久网站| 无人在线直播免费观看| 国产av无码专区亚洲av毛片搜| 亚洲乱码精品久久久久..| 波多野结衣在线免费观看| 人成午夜免费大片在线观看| 亚洲宅男永久在线| 亚洲国产精品日韩| 中文字幕无码成人免费视频 |