??xml version="1.0" encoding="utf-8" standalone="yes"?>
1.本h当前使用的Tomcat版本为:6.0.20Qoracle为稳定的9i版本
2.下文为方便v见,依习惯以%Tomcat_Home%表示Tomcat安装的目录,本h安装目录?#8220;E:\Program Files\WindowsXP\tomcat6”
配置步骤如下Q?/p>
1.Tomcat 6的配|和以前的不同了Q不推荐在server.xml中进行配|,而是?Tomcat_Home%\webapps\yourApp\META-INF \context.xml中进行配|才是更好的Ҏ。而不是以前版?Tomcat_Home%\conf下的context.xml文g。这样就可以在不同的web应用下单独配|连接池了,且Tomcat会自动重载。当然你也可以更?Tomcat_Home%\conf下的context.xml文gQ将所有web应用下的q接池进行统一配置?/p>
2.代码修改如下:
view plaincopy to clipboardprint?
<Context reloadable="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/oracleds" auth="Container" type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="scott"
password="tiger"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:ora9"/>
</Context>
<Context reloadable="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/oracleds" auth="Container" type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="scott"
password="tiger"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:ora9"/>
</Context>
name 为当前数据源JNDI的名字,可以随意讑֮Q?/p>
auth 为验证方式;
type 资源cdQ?/p>
driverClassName 为Oracle驱动引用Q?/p>
maxActiv 接池最大激zȝq接敎ͼ设ؓ0表示无限Ӟ
maxIdle 接池最大空闲的q接敎ͼ数据库连接的最大空闲时间。超q空闲时_
数据库连接将被标Cؓ不可用,然后被释放。设?表示无限Ӟ
maxWait 接最大的{待旉Q单位毫U,如果过此时间将接到异常。设?1
表示无限制。;
username 为oracle数据库的一个用户名Q?
password 为username的密码;
url 接oracle的连接地址Q?/p>
注:本h试代?#8220;driverClassName="oracle.jdbc.driver.OracleDriver"”改ؓ“driverClassName="oracle.jdbc.OracleDriver"”E序依然q行正常Q刚开始以师的代码有问题
3.在程序中的调用Ş式ؓQ?/p>
view plaincopy to clipboardprint?
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/oracleds");
Connection conn = ds.getConnection();
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/oracleds");
Connection conn = ds.getConnection();
注:“java:/comp/env/jdbc/oracleds”U色标记文字为步?里设|的Resource name
则可以将建立connection的方式以上述形式取代传统方式Q?/p>
view plaincopy to clipboardprint?
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:ora9";
String username = "scott";
String password = "tiger";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:ora9";
String username = "scott";
String password = "tiger";
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
4.另外q需用到的jdbc驱动cd导入?Tomcat_Home%\lib目录?/p>
否则会抛出如下异常:
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
依上q步骤就能成功的配置Tomcat6.0 q接池,q有|友贴文说需
在web.xml文g中的web-app节点下加入如下代码Ş式:
<resource-ref>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
</resource-ref>
因本人未d此项Q程序依然正,故本为此步骤为非必要?br />
---------------------------------------------------------------------------
今天需要在另一台机器上重新部vpȝQ重新设|db的连接池。当我把tomcat拯到那台机器,q且修改META-INF\context.xmlQ然后重新启动tomcatQ但发现pȝq接的仍然是老的db。再ơ检查了META-INF\context.xml文gQ确信了q个文g已经正确讄dbq接了,q也说明q个文gq没有真正v作用。查看了tomcat下conf\context.xml也没有设|db的连接池。那是哪个文件在起作用呢Q折腾了办法Q后来发现tomcat在conf\Catalina\localhost下生成了一个和原来META-INF\context.xml相同内容的文Ӟ怀疑一定是q个文g在v作用Q删除conf\Catalina\localhost目录Q重启tomcatQ问题消失?/p>
转蝲一?a >tomcat加蝲cȝ序Q?/p>
binQ存攑动和关闭tomcat的脚本文Ӟ
/confQ存放tomcat的各U配|文Ӟ比如Qserver.xml
/server/libQ存放tomcat服务器所需要的各种jar文gQjar文g只可被tomcat 服务器访问)
/server/webappsQ存放tomcat自带的两个web应用Qadmin应用和manager应用?nbsp;
/common/libQ存放tomcat服务器以及所有web应用都可以访问的jar文g夹(web和tomcat服务器都可访问此jarQ?nbsp;
/shared/libQ存放web都可讉K的jar文g。(可以被所有的web讉KQ但不能被tomcat讉KQ?nbsp;
/logsQ存放tomcat的日志文?nbsp;
/webappsQ当发布web应用Ӟ默认情况下把web应用文g放于此目录下
/workQtomcat把由jsp生成的Servlet放于此目?nbsp;
另:在web应用中,WEB-Inf目录下,也可以徏立lib子目录,在此子目录下可以存放各种jar文gQ这些jar文g只能被当前web应用讉K。其中,在web-inf目录下的lib与classes目录QTomcatc装载器先装载classes目录下的c,再装载lib目录下的cR因为类同名Ӟclasses优先?nbsp;
其中jspq行Ӟ查找class的顺序ؓQ项目文件夹QWEB-INF\libQ?==》容器文件夹Qtomcat\common\libQ?=》jdk文g夹(jdk\jre\lib\extQ?nbsp;
Tomcat的class加蝲的优先顺序一?nbsp;
1.最先是$JAVA_HOME/jre/lib/ext/下的jar文g?nbsp;
2.环境变量CLASSPATH中的jar和class文g?nbsp;
3.$CATALINA_HOME/common/classes下的class文g?nbsp;
4.$CATALINA_HOME/commons/endorsed下的jar文g?nbsp;
5.$CATALINA_HOME/commons/i18n下的jar文g?nbsp;
6.$CATALINA_HOME/common/lib 下的jar文g?nbsp;
QJDBC驱动之类的jar文g可以攑֜q里Q这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情c)
7.$CATALINA_HOME/server/classes下的class文g?nbsp;
8.$CATALINA_HOME/server/lib/下的jar文g?nbsp;
9.$CATALINA_BASE/shared/classes 下的class文g?nbsp;
10.$CATALINA_BASE/shared/lib下的jar文g?nbsp;
11.各自具体的webapp /WEB-INF/classes下的class文g?nbsp;
12.各自具体的webapp /WEB-INF/lib下的jar文g?nbsp;
class的搜寻顺序如?nbsp;
-------------
/WEB-INF/classes of your web application
/WEB-INF/lib/*.jar of your web application
$CATALINA_HOME/common/classes
$CATALINA_HOME/common/endorsed/*.jar
$CATALINA_HOME/common/i18n/*.jar
$CATALINA_HOME/common/lib/*.jar
$CATALINA_BASE/shared/classes
$CATALINA_BASE/shared/lib/*.jar
--------------
因此攑֜不同webapp里的class文gQ会被classloader加蝲成不同的实例?nbsp;
例如假设下面两个不同内容的class。分别放在不同的webapp的class目录下?nbsp;
package com.lizongbo;
public class TestClass {
private String NAME="lizongbo";
}
package com.lizongbo;
public class TestClass {
private String NAME="li_zongbo";
}
在不同的webapp得到的com.lizongbo.NAMEl果是不同的Q且互不影响?nbsp;
但是注意Q以下包名开头的class例外Q?nbsp;
javax.*
org.xml.sax.*
org.w3c.dom.*
org.apache.xerces.*
org.apache.xalan.*
ps,注意.在各个jar中的\META-INF\MAINFEST.MF文g里Class-Path键值对Q也会提供jar的加载优先顺序?nbsp;
例如某jar的MAINFEST.MF内容如下Q?nbsp;
Manifest-Version: 1.0
Created-By: lizongbo
Class-Path: commons-beanutils.jar
Class-Path: commons-collections.jar
Class-Path: commons-dbcp.jar
Class-Path: commons-digester.jar
Class-Path: commons-logging.jar
Class-Path: commons-pool.jar
Class-Path: commons-services.jar
Class-Path: commons-validator.jar
Class-Path: jakarta-oro.jar
Main-Class: com.lizongbo.MyTestClass
那么在加载这个jar的时候,会先在此jar所在目录下依次先加载commons-beanutils.jarQcommons-collections.jar。。。等jar文g?nbsp;
在不同的地方攄jar和class可能会生意想不到的后果,Q尤其是不同版本的jar文gQ因此在实际应用部vweb应用时候要特别留心.
例如 使用javamail常见的一个出错信?
javax.mail.NoSuchProviderException: No provider for smtp
其真实原因就很可能如?
在不同的加蝲jar的目录下攄了不同版本的mail.jar,比如一个是javamail1.3.1的mail.jar
在D:\jakarta-tomcat-5.5.8\common\lib?而另外一个是javamail1.3.2的mail.jar?nbsp;
D:\jakarta-tomcat-5.5.8\webapps\lizongbo\WEB-INF/lib?
那么lizongboq个webapp中用到javamailq行邮g发送的时候,便会出现No provider for smtp的错误?/p>