试用 Tomcat7.x 与 Tomcat6.x 的明显不同 + Context 填写方法 + 默认应用配置方法 .
来源:互联网 发布:淘宝主营项目怎么改 编辑:程序博客网 时间:2024/05/02 14:40
今天开始在单位推广 Tomcat7 ,竟然碰到了好多问题。到现在才刚刚解决的差不多。在此介绍一下。
Tomcat6下边程序运行极其正常换了 Tomcat7 忽然不能用的都来看看了~
---------- ---------- ---------- ---------- ----------
第一个问题是关于数据库驱动程序加载。受数据库驱动异常困扰的同胞们,Tomcat7 下边因为 Tomcat 限定了类加载执行时静态代码的执行,需要在生成对象的时候才能够真正执行,所以在 Tomcat6 以前大家熟悉的数据库驱动程序加载方式:
- Class<?> cls = com.mysql.jdbc.Driver.class;
Class<?> cls = com.mysql.jdbc.Driver.class;或者
- Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.jdbc.Driver");都已经不能用了。在使用 DriverManager 生成的数据库连接的时候,会出现“No suitable driver found for jdbc”这个异常。
现在正确的数据库驱动程序加载方式,要求生成数据库驱动类的对象。推荐
- com.mysql.jdbc.Driver.class.newInstance();
com.mysql.jdbc.Driver.class.newInstance();这种方式不用处理异常,而且生成的无用对象会最短时间被垃圾回收。
当然了,也可以用一个引用类型变量把此对象接出来,但没有什么实际用途吧……
- java.sql.Driver driver = com.mysql.jdbc.Driver.class.newInstance();
java.sql.Driver driver = com.mysql.jdbc.Driver.class.newInstance();其中 java.sql.Driver 是各个数据库管理系统提供的驱动程序类的接口,属于 JDBC 规范,适合用 import java.sql.Driver; 进行缩写。
---------- ---------- ---------- ---------- ----------
第二个问题,是线程启动的问题。因为 Tomcat7 或者 -server 方式运行的爪哇虚拟机(JVM)的一些我尚未掌握的保护机制,所以当一个线程经历空循环时,就会被架空。
- while(flag) { }
while(flag) { }于是通过 flag 作为线程控制变量的控制方法,就没办法继续使用了。这个时候,要时常跳过这个人工卡死的线程,以便其能够总在执行而不会真的陷入僵死。
- while(flag) { Thread.yield(); }
while(flag) { Thread.yield(); }
---------- ---------- ---------- ---------- ----------
同时 unpackWAR 属性的默认值,在 Tomcat6 时是 true ,意味着默认状态将会解压 .war 然后再执行;而 Tomcat7 变成了默认 false ,不展开。
---------- ---------- ---------- ---------- ----------
- <Context
- crossContext="true"
- privileged="true"
- path=""
- docBase="/usr/local/example.war"
- reloadable="false"
- unpackWAR="true"
- cachingAllowed="true"
- cacheMaxSize="1024"
- ></Context>
<ContextcrossContext="true"privileged="true"path=""docBase="/usr/local/example.war"reloadable="false"unpackWAR="true"cachingAllowed="true"cacheMaxSize="1024"></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 。
转载地址:http://blog.csdn.net/shanelooli/article/details/7408675
- 试用 Tomcat7.x 与 Tomcat6.x 的明显不同 + Context 填写方法 + 默认应用配置方法
- 试用 Tomcat7.x 与 Tomcat6.x 的明显不同 + Context 填写方法 + 默认应用配置方法
- 试用 Tomcat7.x 与 Tomcat6.x 的明显不同 + Context 填写方法 + 默认应用配置方法 .
- 试用 Tomcat7.x 与 Tomcat6.x 的明显不同 + Context 填写方法 + 默认应用配置方法(转自ShaneLooLi)
- Tomcat6.x DataSource的配置与使用
- spring3.X MVC 在tomcat6和tomcat7加载静态资源的不同
- tomcat6.X虚拟目录配置
- Tomcat6.x与7.x
- MyEclipse 配置Tomcat7.x
- opencv2.x配置方法
- Tomcat6配置SSL的方法
- Tomcat6配置SSL的方法
- Tomcat6配置SSL的方法
- Tomcat6配置SSL的方法
- Tomcat6配置SSL的方法
- tomcat6与tomcat7的区别?
- tomcat6.x 发布Javaweb应用
- CentOS6.X 查看、配置网络的方法
- Cloudfoundry之warden容器的资源限制
- Android 联系人管理(包括大部分字段),增删该查,批量插入、删除、更新,等等; 可能有问题,还望指证。
- different group sms
- C#正则表达式抓取网站信息
- 谜题8:Dos Equis
- 试用 Tomcat7.x 与 Tomcat6.x 的明显不同 + Context 填写方法 + 默认应用配置方法 .
- MySql数据库的安装
- 浅谈Java SE、Java EE、Java ME三者的区别
- Node.js学习笔记(9、模块管理器npm)
- opencv所有实用资料
- 滚动的时候让键盘消失
- 当CAsyncSocket遇到多线程(转)
- java log
- 一个自创的多线程池设计-升级版