隨筆-61  評論-13  文章-19  trackbacks-0
            2007年7月5日
               摘要:   閱讀全文
          posted @ 2010-02-04 15:30 xnabx 閱讀(1614) | 評論 (1)編輯 收藏
               摘要:   閱讀全文
          posted @ 2010-01-25 11:10 xnabx 閱讀(1032) | 評論 (1)編輯 收藏
               摘要:   閱讀全文
          posted @ 2010-01-21 09:52 xnabx 閱讀(1726) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2010-01-15 10:10 xnabx 閱讀(1408) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2010-01-15 09:57 xnabx 閱讀(338) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2009-12-04 11:45 xnabx 閱讀(606) | 評論 (3)編輯 收藏
               摘要:   閱讀全文
          posted @ 2009-12-03 15:26 xnabx 閱讀(313) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2009-12-01 16:02 xnabx 閱讀(188) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2009-12-01 11:05 xnabx 閱讀(324) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2009-11-10 09:05 xnabx 閱讀(761) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2009-03-18 14:06 xnabx 閱讀(151) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2008-10-29 16:34 xnabx 閱讀(113) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2008-07-30 15:18 xnabx 閱讀(239) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2008-07-23 11:20 xnabx 閱讀(388) | 評論 (0)編輯 收藏
          出處:http://www.aygfsteel.com/xmatthew/archive/2008/04/14/192450.html
          (轉(zhuǎn))設(shè)計一個Tomcat訪問日志分析工具
          常使用web服務(wù)器的朋友大都了解,一般的web server有兩部分日志:
              一是運行中的日志,它主要記錄運行的一些信息,尤其是一些異常錯誤日志信息
              二是訪問日志信息,它記錄的訪問的時間,IP,訪問的資料等相關(guān)信息。
             
          現(xiàn)在我來和大家介紹一下利用tomcat產(chǎn)生的訪問日志數(shù)據(jù),我們能做哪些有效的分析數(shù)據(jù)?

          首先是配置tomcat訪問日志數(shù)據(jù),默認情況下訪問日志沒有打開,配置的方式如下:
              編輯 ${catalina}/conf/server.xml文件.注:${catalina}是tomcat的安裝目錄
              把以下的注釋(<!-- -->)去掉即可。
                      <!--
                  <Valve className="org.apache.catalina.valves.AccessLogValve"
                           directory="logs"  prefix="localhost_access_log." suffix=".txt"
                           pattern="common" resolveHosts="false"/>
                  -->
              其中 directory是產(chǎn)生的目錄 tomcat安裝${catalina}作為當(dāng)前目錄
              pattern表示日志生產(chǎn)的格式,common是tomcat提供的一個標準設(shè)置格式。其具體的表達式為 %h %l %u %t "%r" %s %b
              但本人建議采用以下具體的配置,因為標準配置有一些重要的日志數(shù)據(jù)無法生。
                  %h %l %u %t "%r" %s %b %T 
          具體的日志產(chǎn)生樣式說明如下(從官方文檔中摘錄):
              * %a - Remote IP address
              * %A - Local IP address
              * %b - Bytes sent, excluding HTTP headers, or '-' if zero
              * %B - Bytes sent, excluding HTTP headers
              * %h - Remote host name (or IP address if resolveHosts is false)
              * %H - Request protocol
              * %l - Remote logical username from identd (always returns '-')
              * %m - Request method (GET, POST, etc.)
              * %p - Local port on which this request was received
              * %q - Query string (prepended with a '?' if it exists)
              * %r - First line of the request (method and request URI)
              * %s - HTTP status code of the response
              * %S - User session ID
              * %t - Date and time, in Common Log Format
              * %u - Remote user that was authenticated (if any), else '-'
              * %U - Requested URL path
              * %v - Local server name
              * %D - Time taken to process the request, in millis
              * %T - Time taken to process the request, in seconds

          There is also support to write information from the cookie, incoming header, the Session or something else in the ServletRequest. It is modeled after the apache syntax:

              * %{xxx}i for incoming headers
              * %{xxx}c for a specific cookie
              * %{xxx}r xxx is an attribute in the ServletRequest
              * %{xxx}s xxx is an attribute in the HttpSession


          現(xiàn)在我們回頭再來看一下下面這個配置 %h %l %u %t "%r" %s %b %T 生產(chǎn)的訪問日志數(shù)據(jù),我們可以做哪些事?
          先看一下,我們能得到的數(shù)據(jù)有:
              * %h 訪問的用戶IP地址
              * %l 訪問邏輯用戶名,通常返回'-'
              * %u 訪問驗證用戶名,通常返回'-'
              * %t 訪問日時
              * %r 訪問的方式(post或者是get),訪問的資源和使用的http協(xié)議版本
              * %s 訪問返回的http狀態(tài)
              * %b 訪問資源返回的流量
              * %T 訪問所使用的時間
             
          有了這些數(shù)據(jù),我們可以根據(jù)時間段做以下的分析處理(圖片使用jfreechart工具動態(tài)生成):
            * 獨立IP數(shù)統(tǒng)計
            * 訪問請求數(shù)統(tǒng)計
            * 訪問資料文件數(shù)統(tǒng)計
            * 訪問流量統(tǒng)計
            * 訪問處理響應(yīng)時間統(tǒng)計
            * 統(tǒng)計所有404錯誤頁面
            * 統(tǒng)計所有500錯誤的頁面
            * 統(tǒng)計訪問最頻繁頁面
            * 統(tǒng)計訪問處理時間最久頁面
            * 統(tǒng)計并發(fā)訪問頻率最高的頁面



























          分析工具包括兩大部分,一個是后臺解釋程序,每天執(zhí)行一次對后臺日志數(shù)據(jù)進行解析后保存到數(shù)據(jù)庫中。
          第二個是顯示程序,從數(shù)據(jù)庫中查詢數(shù)據(jù)并生成相應(yīng)的圖表信息。
          posted @ 2008-04-15 12:06 xnabx 閱讀(562) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2008-04-09 08:50 xnabx 閱讀(36) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2008-03-19 13:00 xnabx 閱讀(190) | 評論 (0)編輯 收藏

          如果你覺得你的Eclipse在啟動的時候很慢(比如說超過20秒鐘),也許你要調(diào)整一下你的Eclipse啟動參數(shù)了,以下是一些``小貼士'':

          1. 檢查啟動Eclipse的JVM設(shè)置。 在Help\About Eclipse SDK\Configuration Detail里面,你可以看到啟動Eclipse的JVM。 這個JVM和你在Eclipse中設(shè)置的Installed JDK是兩回事情。 如果啟動Eclipse的JVM還是JDK 1.4的話,那最好改為JDK 5,因為JDK 5的性能比1.4更好。

          C:\eclipse\eclipse.exe -vm "C:\Program Files\Java\jdk1.5.0_08\ bin\javaw.exe"

          2. 檢查Eclipse所使用的heap的大小。 在C:\eclipse目錄下有一個配置文件eclipse.ini,其中配置了Eclipse啟動的默認heap大小

          -vmargs
          -Xms40M
          -Xmx256M

          所以你可以把默認值改為:

          -vmargs
          -Xms256M
          -Xmx512M

          當(dāng)然,也可以這樣做,把堆的大小改為256 - 512。

          C:\eclipse\eclipse.exe -vm "C:\Program Files\Java\jdk1.5.0_08\ bin\javaw.exe" -vmargs -Xms256M -Xmx512M

          3. 其他的啟動參數(shù)。 如果你有一個雙核的CPU,也許可以嘗試這個參數(shù):

          -XX:+UseParallelGC

          讓GC可以更快的執(zhí)行。(只是JDK 5里對GC新增加的參數(shù))

          posted @ 2007-12-25 10:55 xnabx 閱讀(488) | 評論 (0)編輯 收藏
           

          Java對多線程的支持與同步機制深受大家的喜愛,似乎看起來使用了synchronized關(guān)鍵字就可以輕松地解決多線程共享數(shù)據(jù)同步問題。到底如何?――還得對synchronized關(guān)鍵字的作用進行深入了解才可定論。

          總的說來,synchronized關(guān)鍵字可以作為函數(shù)的修飾符,也可作為函數(shù)內(nèi)的語句,也就是平時說的同步方法和同步語句塊。如果再細的分類,synchronized可作用于instance變量、object reference(對象引用)、static函數(shù)和class literals(類名稱字面常量)身上。

          在進一步闡述之前,我們需要明確幾點:

          A.無論synchronized關(guān)鍵字加在方法上還是對象上,它取得的鎖都是對象,而不是把一段代碼或函數(shù)當(dāng)作鎖――而且同步方法很可能還會被其他線程的對象訪問。

          B.每個對象只有一個鎖(lock)與之相關(guān)聯(lián)。

          C.實現(xiàn)同步是要很大的系統(tǒng)開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。

          接著來討論synchronized用到不同地方對代碼產(chǎn)生的影響:

          假設(shè)P1P2是同一個類的不同對象,這個類中定義了以下幾種情況的同步塊或同步方法,P1P2就都可以調(diào)用它們。

          1. synchronized當(dāng)作函數(shù)修飾符時,示例代碼如下:

          Public synchronized void methodAAA()

          {

          //….

          }

          這也就是同步方法,那這時synchronized鎖定的是哪個對象呢?它鎖定的是調(diào)用這個同步方法對象。也就是說,當(dāng)一個對象P1在不同的線程中執(zhí)行這個同步方法時,它們之間會形成互斥,達到同步的效果。但是這個對象所屬的Class所產(chǎn)生的另一對象P2卻可以任意調(diào)用這個被加了synchronized關(guān)鍵字的方法。

          上邊的示例代碼等同于如下代碼:

          public void methodAAA()

          {

          synchronized (this)      // (1)

          {

                 //…..

          }

          }

           (1)處的this指的是什么呢?它指的就是調(diào)用這個方法的對象,如P1。可見同步方法實質(zhì)是將synchronized作用于object reference。――那個拿到了P1對象鎖的線程,才可以調(diào)用P1的同步方法,而對P2而言,P1這個鎖與它毫不相干,程序也可能在這種情形下擺脫同步機制的控制,造成數(shù)據(jù)混亂:(

          2.同步塊,示例代碼如下:

                     public void method3(SomeObject so)

                        {

                               synchronized(so)

          {

                 //…..

          }

          }

          這時,鎖就是so這個對象,誰拿到這個鎖誰就可以運行它所控制的那段代碼。當(dāng)有一個明確的對象作為鎖時,就可以這樣寫程序,但當(dāng)沒有明確的對象作為鎖,只是想讓一段代碼同步時,可以創(chuàng)建一個特殊的instance變量(它得是一個對象)來充當(dāng)鎖:

          class Foo implements Runnable

          {

                 private byte[] lock = new byte[0]; // 特殊的instance變量

              Public void methodA()

          {

                 synchronized(lock) { //… }

          }

          //…..

          }

          注:零長度的byte數(shù)組對象創(chuàng)建起來將比任何對象都經(jīng)濟――查看編譯后的字節(jié)碼:生成零長度的byte[]對象只需3條操作碼,而Object lock = new Object()則需要7行操作碼。

          3.將synchronized作用于static 函數(shù),示例代碼如下:

                Class Foo

          {

          public synchronized static void methodAAA()   // 同步的static 函數(shù)

          {

          //….

          }

          public void methodBBB()

          {

                 synchronized(Foo.class)   // class literal(類名稱字面常量)

          }

                 }

             代碼中的methodBBB()方法是把class literal作為鎖的情況,它和同步的static函數(shù)產(chǎn)生的效果是一樣的,取得的鎖很特別,是當(dāng)前調(diào)用這個方法的對象所屬的類(Class,而不再是由這個Class產(chǎn)生的某個具體對象了)。

          記得在《Effective Java》一書中看到過將 Foo.class P1.getClass()用于作同步鎖還不一樣,不能用P1.getClass()來達到鎖這個Class的目的。P1指的是由Foo類產(chǎn)生的對象。

          可以推斷:如果一個類中定義了一個synchronizedstatic函數(shù)A,也定義了一個synchronized instance函數(shù)B,那么這個類的同一對象Obj在多線程中分別訪問AB兩個方法時,不會構(gòu)成同步,因為它們的鎖都不一樣。A方法的鎖是Obj這個對象,而B的鎖是Obj所屬的那個Class

          小結(jié)如下:

          搞清楚synchronized鎖定的是哪個對象,就能幫助我們設(shè)計更安全的多線程程序。

           

          還有一些技巧可以讓我們對共享資源的同步訪問更加安全:

          1. 定義private instance變量+它的 get方法,而不要定義public/protectedinstance變量。如果將變量定義為public,對象在外界可以繞過同步方法的控制而直接取得它,并改動它。這也是JavaBean的標準實現(xiàn)方式之一。

          2. 如果instance變量是一個對象,如數(shù)組或ArrayList什么的,那上述方法仍然不安全,因為當(dāng)外界對象通過get方法拿到這個instance對象的引用后,又將其指向另一個對象,那么這個private變量也就變了,豈不是很危險。這個時候就需要將get方法也加上synchronized同步,并且,只返回這個private對象的clone()――這樣,調(diào)用端得到的就是對象副本的引用了。


          posted @ 2007-10-11 14:19 xnabx 閱讀(265) | 評論 (0)編輯 收藏
               摘要:   閱讀全文
          posted @ 2007-07-29 09:17 xnabx 閱讀(389) | 評論 (0)編輯 收藏

          這幾個學(xué)習(xí)材料非常短小精悍,可清晰快捷的掌握以下幾個概念,方便更深入學(xué)習(xí) 

          XML tutorial:

          http://www.w3schools.com/xml/default.asp

           

          SOAP tutorial:

          http://www.w3schools.com/soap/default.asp

           

          WSDL tutorial:

          http://www.w3schools.com/wsdl/default.asp

           

          WEB Service tutorial:

          http://www.w3schools.com/webservices/default.asp

          posted @ 2007-07-13 09:00 xnabx 閱讀(177) | 評論 (0)編輯 收藏


          類-->對象-->實例

          人類是類
          某個人是對象
          你是實例
          實例本身也是對象。

          表現(xiàn)出來是這樣的
          String 類
          String str   str是對象
          String str = "abc";  "abc"是實例,也是對象.
          這樣也能解釋instance of object這種說法  str的實例是"abc"
          posted @ 2007-07-05 08:47 xnabx 閱讀(430) | 評論 (1)編輯 收藏
          主站蜘蛛池模板: 周至县| 稷山县| 涞水县| 马公市| 团风县| 弥勒县| 福泉市| 华宁县| 枝江市| 石狮市| 平湖市| 宝丰县| 鄂伦春自治旗| 蒙山县| 普兰店市| 峨山| 莱阳市| 大兴区| 崇州市| 金坛市| 荆门市| 扎囊县| 喀什市| 资兴市| 饶平县| 白银市| 普兰店市| 姜堰市| 广丰县| 徐州市| 安吉县| 微博| 丰台区| 铜川市| 云梦县| 出国| 易门县| 永城市| 丰县| 建水县| 绥棱县|