1、添加全局数据源
在$TOMCAT_HOME$/conf/server.xml文件中添加以下JNDI数据源配置:
<Resource name="jdbc/test" auth="Container"
type="javax.sql.DataSource"
username="test"
password="test"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:test"
maxActive="100"
maxIdle="30"
maxWait="10000"/>
2、在应用中添加引用全局数据源的配置
在项目中/WEB-INF/下的web.xml中加入以下配置
<resource-ref>
<description>OracleDataSource</description>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
3、添加JDBC驱动包
将Oracle的驱动包(ojdbc14.jar)放到拷贝到 $TOMCAT_HOME$/目录下的lib中。
4、在应用中使用JNDI(也可以在应用中使用Spring来获取Tomcat的JNDI数据源)
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/test");
Connection conn = ds.getConnection();
疑问:
1、Tomcat采用的默认数据连接池类型是哪种?
Tomcat默认采用DBCP连接池,但是Tomcat默认使用的DBCP的jar包被tomcat重新打包整理了,类路径跟apache 的DBCP包不一样。被tomcat整理后的jar包在$TOMCAT_HOME$/lib/tomcat-dbcp.jar。
怎么证明Tomcat默认采用的就是被Tomcat整理过的DBCP呢?
打开$TOMCAT_HOME$/lib/catalina.jar的ResourceFactory.class的109行(如下代码):
else if (ref.getClassName().equals("javax.sql.DataSource")) {
String javaxSqlDataSourceFactoryClassName = System.getProperty("javax.sql.DataSource.Factory", "org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory");
try
{
factory = (ObjectFactory)Class.forName(javaxSqlDataSourceFactoryClassName).newInstance();
}
当factory属性没有配置并且type属性等于 javax.sql.DataSource时,采用org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory数据库连接池。
2、如何改为自己指定的连接池类型?
如果你使用其他数据源如DBCP数据源,需要在<Resouce 标签多添加一个属性如factory="org.apache.commons.dbcp.BasicDataSourceFactory"当然你也要把DBCP相关jar包放在tomcat的lib目录下。
3、不同项目用到不用数据源,不要因为某些数据源没法访问而导致其他项目应用跑不起来。
在WebRoot下面建文件夹META-INF,里面建一个文件context.xml,添加内容和以上一样。可以把配置需要jar包直接放在WEB-INF的lib里面,而不需要一定要放在Tomcat的lib目录下。
如果一个项目分成几个war部署,建议采用全局数据源配置较好。如果只是开发可以使用局部的方式。
4、JNDI数据源配置在config/server.xml和config/context.xml有什么区别?
在tomcat6版本中,context元素已经从server.xml文件中独立出来了,放在一个context.xml文件中。因为server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件则不然,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。