tomcat知識點

1.

1.部署三種方式:

   (1) 在server.xml的Host標籤內新建一個Context標籤

     <Context path="/learn1" reloadable="true" docBase="E:/work/tech/project/learn1/WebRoot" workDir="E:/work/tech/project/learn1/WebRoot/work" />

      * workDir是指Tomcat解析Jsp轉換爲Java文件,並編譯爲class存放的文件夾,設置在項目文件夾裏面,可以避免移植到其他地方首次讀取jsp文件需要重新解析 。一般格式:項目文件夾/work  

   (2) 放在tomcat的webapps下

   (3) 在tomcat的conf/Catalina/localhost下建立一文件   <訪問路徑>.xml, 內容同(1)

 

2.    <context reloadable=true> tomcat會自動檢測/WEB-INF/lib和/class下的更新

       http://localhost:8080/manager/reload?path=/<項目名> 可重新裝載該項目,避免重啓

 

3.1.性能
(1)使用線程池
  Servlet引擎爲每一個請求創建一個隔離的線程,分配這個線程給service()方法,在它執行完後移除這個線程。默認情況下,servlet引擎 爲每一個請求創建新的線程。因爲創建和消除線程是需要系統開銷的,可以通過使用線程池來提升性能。依據所期望的併發用戶數量,配置線程池的最大、最小、以 及增加數量。在服務啓動的時候,servlet引擎使用最小的線程數量創建一個線程池。然後servlet引擎會分配線程給每一個請求,替換原來的創建新 的線程,在處理完成後把線程返回給線程池。使用線程池,性能會有一個顯著的提升。如果需要,根據線程的最大和增加數量,更多的線程會被創建,添加到池中以 供更多的請求使用。

(2)禁止servlet和jsp的自動重載
  爲了節約開發時間,在開發階段Servlet/JSP容器提供自動重載功能,方便你在修改Servlet/JSP後不用重新啓動服務。可是,在J2EE的生產環境下關閉自動載入功能可以得到更好的性能。

(3)控制HttpSession
    一個常見的誤解是以爲session在有客戶端訪問時就被創建,然而事實是直到某server端程式調用 HttpServletRequest.getSession(true)這樣的語句時才被創建,注意如果JSP沒有顯示的使用 <%@page session="false"%> 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的session對象的來歷。由於session會消耗內 存資源,因此,如果不打算使用session,應該在所有的JSP中關閉他。
  在默認情況下,不要在jsp頁面中創建HttpSessions對象,jsp頁面默認會自動創建HttpSessions,如果在你的jsp頁面中不需要HttpSessions,爲了節省一些性能,使用下面的頁面指令避免自動創建HttpSessions對象。
  <%@ page session="false"%>
  不要存儲大型對象到HttpSession:如果你存儲大型對象數據到HttpSession中,應用服務器不得不在每一次請求中處理整個的 HttpSession,這將會強迫使用java的串行化操作,佔用大量系統資源。應用服務的性能將會因爲java的串行化操作而減少。
  在結束時候釋放HttpSessions對象:在它們不在需要的時候使用HttpSession.invalidate()方法消除sessions。
  設置session的超時值:servlet有一個默認的超時值。如果你在這個時間裏面,你既沒有移除它,也沒有使用它(進行任何服務請求),servlet服務將會自動將其銷燬。儘可能的保持session 的超時值最小。
    session在下列情況下被刪除a.程式調用HttpSession.invalidate();或b.距離上一次收到客戶端發送的session id時間間隔超過了session的超時設置;或c.服務器進程被停止(非持久session)

 

4.管理頁面:

    http://localhost:8080/manager/status  查看tomcat的併發訪問量

 

5. tomcat啓動時會裝載contextConfigLocation參數指定的文件, 如果不指定contextConfigLocation參數 默認裝載/WEB-INF/applicationContext.xml文件


6.性能優化

     1) 加大tomcat連接線程數

    server.xml的<Connector裏:

   minProcessors最小空閒連接數。默認10

   maxProcessors併發處理的最大請求數,默認爲75

   acceptCount 允許最大的連接數,應該>=maxProcessor,默認爲100

  enableLookups 允許反查域名,爲了提高處理能力,設爲false

 connectionTimeout 網絡連接超時,單位:毫秒,通常爲30000

  * 加大併發數應該同時加大maxProcessors和acceptCount,可爲1024

*允許的最大連接數還受限於操作系統的內核參數,通常windows是2000個左右,linux是1000個左右

 

     2) . PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域,
這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space中,
它和存放類實例(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對
PermGen space進行清理,所以如果你的應用中有很多CLASS的話,就很可能出現PermGen space錯誤,
這種錯誤常見在web服務器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小
超過了jvm默認的大小(4M)那麼就會產生java.lang.OutOfMemoryError: PermGen space 錯誤信息了。
解決方法: 手動設置MaxPermSize大小
  修改TOMCAT_HOME/bin/catalina.sh, 在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建議:將相同的第三方jar文件移置到tomcat/shared/lib目錄下,這樣可以達到減少jar 文檔重複佔用內存的目的。

 

   3)Heap size 設置
   堆( Heap)是 Java 程序的對象生活的地方,包含活的對象,死的對象以及剩餘內存。.JVM在啓動的時候會自動設置Heap size的值, 其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。
提示:在JVM中如果98%的時間是用於GC且可用的Heap size 不足2%的時候將拋出java.lang.OutOfMemoryError: Java heap space 異常信息。
提示:Heap Size 最大不要超過可用物理內存的80%,一般的要將-Xms和-Xmx選項設置爲相同,而-Xmn爲1/4的-Xmx值。
解決方法:手動設置Heap size
修改TOMCAT_HOME/bin/catalina.sh
在“echo "Using CATALINA_BASE:   $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -Xms800m -Xmx800m   -XX:MaxNewSize=256m"

 

       4)實例,以下給出1G內存環境下java jvm 的參數設置參考:
JAVA_OPTS="-server -Xms800m -Xmx800m  -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

3. 連接池

   (1) 將數據庫驅動程序的JAR文件放在Tomcat的 common/lib 中;

  (2)方法一:局部連接池(僅供本App使用) 在web.xml中或者tomcat_home/conf/localhost/下建立一個<yourAppName>.xml

     <Context>
     <Resource
          name="jdbc/test"
          type="javax.sql.DataSource"
          password="bb"
          driverClassName="com.mysql.jdbc.Driver"
          maxIdle="2"
          maxWait="50"
          username="root"
          url="jdbc:mysql://localhost:3306/test"
          maxActive="4"/>
</Context>

 

 

 

 

        方法二:配置全局resource,然後通過resourcelink來映射,

           (a) tomcat/conf/server.xml的GlobalNamingResources中增加
<Resource name="jdbc/mydb" type="javax.sql.DataSource" password="mypwd" driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver" maxIdle="30" maxWait="5000" validationQuery="select 1" username="sa" url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb" maxActive="200"/>

      * 參數說明:

              maxIdle,最大空閒數,數據庫連接的最大空閒時間。超過空閒時間,數據庫連接將被標記爲不可用,然後被釋放。設爲0表示無限制。
              MaxActive,連接池的最大數據庫連接數。設爲0表示無限制。
              maxWait ,最大建立連接等待時間。如果超過此時間將接到異常。設爲-1表示無限制。

          (b)、在tomcat/webapps/myapp/META-INF/context.xml的Context中增加:
<ResourceLink global="jdbc/mydb" name="jdbc/mydb" type="javax.sql.DataSource"/>

 

     (4)編碼:
      private static DataSource pool;
      static {
           Context env = null;
            try {
                env = (Context) new InitialContext().lookup("java:comp/env");
                pool = (DataSource)env.lookup("jdbc/WSPool");
                if(pool==null)
                    System.err.println("'DBPool' is an unknown DataSource");
                 } catch(NamingException ne) {
                    ne.printStackTrace();
            }

 

   (5) 用DBPool.getPool().getConnection(),獲得一個Connection對象,就可以進行數據庫操作,最後別忘了對 Connection對象調用close()方法,注意:這裏不會關閉這個Connection,而是將這個Connection放回數據庫連接池。

      * jdbc通常是用DriverManager獲得連接的

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章