試用 Tomcat7.x 與 Tomcat6.x 的明顯不一樣 + Context 填寫方法 + 默

今天開始在單位推廣 Tomcat7 ,居然碰到了好多問題。到如今纔剛剛解決的差很少。在此介紹一下。html

Tomcat6下邊程序運行極其正常換了 Tomcat7 突然不能用的都來看看了~
java


---------- ---------- ---------- ---------- ----------
mysql


第一個問題是關於數據庫驅動程序加載。受數據庫驅動異常困擾的同胞們,Tomcat7 下邊由於 Tomcat 限定了類加載執行時靜態代碼的執行,須要在生成對象的時候纔可以真正執行,因此在 Tomcat6 之前你們熟悉的數據庫驅動程序加載方式:web

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_1 height=16 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=1&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. Class<?> cls = com.mysql.jdbc.Driver.class;  

或者sql

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_2 height=16 name=ZeroClipboardMovie_2 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=2&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. Class.forName("com.mysql.jdbc.Driver");  

都已經不能用了。在使用 DriverManager 生成的數據庫鏈接的時候,會出現「No suitable driver found for jdbc」這個異常。數據庫


如今正確的數據庫驅動程序加載方式,要求生成數據庫驅動類的對象。推薦緩存

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_3 height=16 name=ZeroClipboardMovie_3 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=3&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. com.mysql.jdbc.Driver.class.newInstance();  

這種方式不用處理異常,並且生成的無用對象會最短期被垃圾回收。網絡

固然了,也能夠用一個引用類型變量把此對象接出來,但沒有什麼實際用途吧……app

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_4 height=16 name=ZeroClipboardMovie_4 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=4&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. java.sql.Driver driver = com.mysql.jdbc.Driver.class.newInstance();  

其中 java.sql.Driver 是各個數據庫管理系統提供的驅動程序類的接口,屬於 JDBC 規範,適合用 import java.sql.Driver; 進行縮寫。oop


---------- ---------- ---------- ---------- ----------


第二個問題,是線程啓動的問題。由於 Tomcat7 或者 -server 方式運行的爪哇虛擬機(JVM)的一些我還沒有掌握的保護機制,因此當一個線程經歷空循環時,就會被架空。

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_5 height=16 name=ZeroClipboardMovie_5 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=5&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. while(flag) { }  

因而經過 flag 做爲線程控制變量的控制方法,就沒辦法繼續使用了。這個時候,要時常跳過這我的工卡死的線程,以便其可以總在執行而不會真的陷入僵死。

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_6 height=16 name=ZeroClipboardMovie_6 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=6&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  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> 片斷。

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_7 height=16 name=ZeroClipboardMovie_7 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=7&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. <Context  
  2.         crossContext="true"  
  3.         privileged="true"  
  4.         path=""  
  5.         docBase="/usr/local/example.war"  
  6.         reloadable="false"  
  7.         unpackWAR="true"  
  8.         cachingAllowed="true"  
  9.         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 。

相關文章
相關標籤/搜索