今天开始在单位推广 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 。