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獲得連接的