今天開始在單位推廣 Tomcat7 ,居然碰到了好多問題。到如今纔剛剛解決的差很少。在此介紹一下。html
Tomcat6下邊程序運行極其正常換了 Tomcat7 突然不能用的都來看看了~
java
---------- ---------- ---------- ---------- ----------
mysql
第一個問題是關於數據庫驅動程序加載。受數據庫驅動異常困擾的同胞們,Tomcat7 下邊由於 Tomcat 限定了類加載執行時靜態代碼的執行,須要在生成對象的時候纔可以真正執行,因此在 Tomcat6 之前你們熟悉的數據庫驅動程序加載方式:web
或者sql
都已經不能用了。在使用 DriverManager 生成的數據庫鏈接的時候,會出現「No suitable driver found for jdbc」這個異常。數據庫
如今正確的數據庫驅動程序加載方式,要求生成數據庫驅動類的對象。推薦緩存
這種方式不用處理異常,並且生成的無用對象會最短期被垃圾回收。網絡
固然了,也能夠用一個引用類型變量把此對象接出來,但沒有什麼實際用途吧……app
其中 java.sql.Driver 是各個數據庫管理系統提供的驅動程序類的接口,屬於 JDBC 規範,適合用 import java.sql.Driver; 進行縮寫。oop
---------- ---------- ---------- ---------- ----------
第二個問題,是線程啓動的問題。由於 Tomcat7 或者 -server 方式運行的爪哇虛擬機(JVM)的一些我還沒有掌握的保護機制,因此當一個線程經歷空循環時,就會被架空。
因而經過 flag 做爲線程控制變量的控制方法,就沒辦法繼續使用了。這個時候,要時常跳過這我的工卡死的線程,以便其可以總在執行而不會真的陷入僵死。
---------- ---------- ---------- ---------- ----------
Tomcat7 的配置文件中,Context 配置,debug 屬性被取消了,若是依然使用,會報出一個警告。
同時 unpackWAR 屬性的默認值,在 Tomcat6 時是 true ,意味着默認狀態將會解壓 .war 而後再執行;而 Tomcat7 變成了默認 false ,不展開。
---------- ---------- ---------- ---------- ----------
另外還有一個並非 Tomcat7 新有的特色。以前 conf/Catalina/localhost 下邊會自動創建 ROOT.xml ,如今不會了。而後以前此目錄下的配置文件,會以其中 path 屬性指明的路徑爲「應用路徑」;如今則會以 XML 文件的名字做爲應用路徑。若是你們想製做一個不須要填寫應用路徑就能夠訪問的應用,請記得必定要本身創建一個 ROOT.xml ,區分大小寫,而後在其中編寫 <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 。