1. 程式人生 > >深入理解Tomcat 6和Tomcat7的區別

深入理解Tomcat 6和Tomcat7的區別

今天開始學習Tomcat7 ,竟然碰到了好多問題。到現在才剛剛解決的差不多。在此介紹一下。
Tomcat6下邊程式執行極其正常換了 Tomcat7 忽然不能用的都來看看了~


第一個:
是關於資料庫驅動程式載入。受資料庫驅動異常困擾的同胞們,Tomcat7 下邊因為 Tomcat 限定了類載入執行時靜態程式碼的執行,需要在生成物件的時候才能夠真正執行,所以在 Tomcat6 以前大家熟悉的資料庫驅動程式載入方式:
1
Class<?> cls = com.mysql.jdbc.Driver.class; 
2
//或
3
Class.forName("com.mysql.jdbc.Driver"
); 在使用 DriverManager 生成的資料庫連線的時候,會出現“No suitable driver found for jdbc”這個異常。 現在正確的資料庫驅動程式載入方式,要求生成資料庫驅動類的物件。推薦 1 com.mysql.jdbc.Driver.class.newInstance(); 這種方式不用處理異常,而且生成的無用物件會最短時間被垃圾回收。 當然了,也可以用一個引用型別變數把此物件接出來,但沒有什麼實際用途吧…… 1 java.sql.Driver driver = com.mysql.jdbc.Driver.class.newInstance();
其中 java.sql.Driver 是各個資料庫管理系統提供的驅動程式類的介面,屬於 JDBC 規範,適合用 import java.sql.Driver; 進行縮寫。 第二個: 是執行緒啟動的問題。因為 Tomcat7 或者 -server 方式執行的爪哇虛擬機器(JVM)的一些我尚未掌握的保護機制,所以當一個執行緒經歷空迴圈時,就會被架空。 1 while(flag) { } 於是通過 flag 作為執行緒控制變數的控制方法,就沒辦法繼續使用了。這個時候,要時常跳過這個人工卡死的執行緒,以便其能夠總在執行而不會真的陷入僵死。 1 while(flag) { Thread.yield
(); } Tomcat7 的配置檔案中,Context 配置,debug 屬性被取消了,如果依然使用,會報出一個警告。 同時 unpackWAR 屬性的預設值,在 Tomcat6 時是 true ,意味著預設狀態將會解壓 .war 然後再執行;而 Tomcat7 變成了預設 false ,不展開。 第三個: 另外還有一個並不是 Tomcat7 新有的特點。之前 conf/Catalina/localhost 下邊會自動建立 ROOT.xml ,現在不會了。然後之前此目錄下的配置檔案,會以其中 path 屬性指明的路徑為“應用路徑”;現在則會以 XML 檔案的名字作為應用路徑。如果大家想製作一個不需要填寫應用路徑就可以訪問的應用,請記得一定要自己建立一個 ROOT.xml ,區分大小寫,然後在其中編寫 <Context> 片段。 01 <Context 02 crossContext="true" 03 privileged="true" 04 path="" 05 docBase="/usr/local/example.war" 06 reloadable="false" 07 unpackWAR="true" 08 cachingAllowed="true" 09 cacheMaxSize="1024" 10 ></Context> crossContext="true" ,是允許應用通過 ServletContext.getContext() 去拿到一個通往別的應用 request dispatcher 。當然了,這種方法無法跨越現在 Tomcat 支援的虛擬主機界限。也就是說,能夠穿透訪問的,必須是和當前應用在一個 <Host> 之中的應用。 privileged="true" 意味著 Tomcat 自身的應用,比如· Tomcat Manager ,可以被當前這個應用訪問。根據官方文件的解釋,這個機理是改變應用的類載入器為 Server class loader 。我想,這種改變,會令應用程式發現 Tomcat 本身的類,都能夠從應用自己的類載入器上尋找到。從而實現對 Tomcat 自身應用程式方法的呼叫。 path 和 docBase 不用多說,都要指定這二個屬性的。其中 docBase 可以是目錄也可以是結構完整的 .war 檔案。 reloadable="true" 意味著 Tomcat 將提供對應用類路徑( /WEB-INF/classes/ 和 /WEB-INF/lib/ )的監測。當這裡邊有內容改變並且其類已經被爪哇虛擬機器(JVM)載入的時候,Tomcat 可以自行重新載入此類。不過此功能對 Tomcat 的穩定服務影響不小,除錯環境可以使用,生產環境還是算了吧——當然,這只是我的個人建議。 unpackWAR 就如字面意思,unpackWAR="true" 意味著 Tomcat 會儲存 .war 包的解壓結果,然後直接對解壓結果進行執行。我個人認為,考慮到爪哇虛擬機器的類載入機制,每個類都僅載入一回,但是頁面內容卻沒有類似的有效快取,所以 .war 還是解壓執行的比較好。而且日誌也將造成 unpackWAR="false" 形同災難。 cachingAllowed="true" 意味著開啟了 Tomcat7 的靜態快取功能。靜態檔案包括 JavaScript 程式、圖片聲音等允許網路訪問的檔案以及 HTML 頁面。 cacheMaxSize 是靜態快取功能緩衝區大小的設定。單位是 MB ,也就是 1024KB 。例子中設為 1024 ,意味著 1GB 。 第四個: tomcat6配置管理員資訊 1:開啟tomcat6下的~/conf/tomcat-users.xml檔案,關於使用者角色、管理員的資訊都在這個配置檔案中。 2:在配置檔案<tomcat-users>節點下新增如下xml <role rolename="admin"/> <role rolename="manager"/> <user username="admin" password="admin" roles="admin,manager"/> 3:啟動tomat6,輸入:使用者名稱:admin 密碼:admin 登陸到管理員介面。 tomcat7配置管理員資訊 1:開啟tomcat7下的~/conf/tomcat-users.xml檔案,關於使用者角色、管理員的資訊都在這個配置檔案中。 2:在配置檔案<tomcat-users>節點下新增如下xml <role rolename="admin-gui"/> <role rolename="manager-gui"/> <user username="admin" password="admin" roles=" admin-gui , manager-gui "/> 3:啟動tomat7,輸入:使用者名稱:admin 密碼:admin 登陸到管理員介面