环境
Tomcat5.0.28+jdk1.4.2+oracle9.2.0.1的驱动包ojdbc14.jar,有点落后了,没办法,客户需要。
在配置前,首先要将所用到的jdbc驱动包放到应用lib目录下,%tomcat_home%\common\lib\目录下也放一份拷贝,因为数据源创建时间比较早,否则会报错,说找不到jdbc驱动。
配置数据源资源
网上找到了两种方式,不知道这两方式的区别,也许和tomcat 版本有关系,我的是tomcat5.0.28,只能用如下第一种方式表示资源,第二种没成功过,一直报错“Cannot create JDBC driver of class ' for connect URL 'null'”。
数据源资源描述配置一:
<Resource name="P3" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="P3">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>50</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>5</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<parameter>
<name>username</name>
<value>zfmi</value>
</parameter>
<parameter>
<name>password</name>
<value>zfmi</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@192.168.9.111:1521:ZFMI</value>
</parameter>
</ResourceParams>
数据源资源描述配置二:
<Resource
name="P3"
type="javax.sql.DataSource"
password="zfmi"
driverClassName="oracle.jdbc.driver.OracleDriver"
maxIdle="2"
maxWait="50"
username="zfmi"
url="jdbc:oracle:thin:@192.168.9.111:1521:ZFMI"
maxActive="4"/>
参数说明:
driveClassName:JDBC驱动类的完整的名称;
maxActive:同时能够从连接池中被分配的可用实例的最大数;
maxIdle:可以同时闲置在连接池中的连接的最大数;
maxWait:最大超时时间,以毫秒计;
password:用户密码;
url:到JDBC的URL连接;
user:用户名称;
validationQuery:用来查询池中空闲的连接。
配置步骤
介绍了资源元素配置后,下面开始正题,一般是要三个步骤:
步骤一、
配置数据源,总的来说有两中思路,思路一是直接在<Context>中配置局部数据源,思路二是先配置全局数据源,然后再在<Context>应用中链接到全局数据源,又因为Tomcat中<Context>位置多样,具体我分为如下几种方法:
方法1、直接在<Context>中配置局部数据源,tomcat中%tomcat_home%\conf\server.xml中的<Context>中添加数据源。未测试。
方法2、直接在<Context>中配置局部数据源,在%tomcat_home%\conf\Catalina\localhost\中添加包含<Context>元素和数据源的XML文件(文件名与应用名不需要一致,习惯最好写成一致,便于区分)。原理和方法1相近。此时,如果应用是直接发布在tomcat中的webapps目录中,<Context>元素的docBase属性可省。测试成功。
方法3、前面两方法都要更改tomcat中其它文件,但为了实现应用的配置完全独立化,而且如果应用直接发布在tomcat中的webapps目录中,还有一种不涉及更改应用之外的文件进行而直接在<Context>中配置局部数据源的方法:将包含<Context>元素和数据源的XML文件放在应用目录下\META-INF\目录中。测试失败。前三种都是直接在<Context>中配置局部数据源,基本原理相同,只是<Context>的具体位置不同而有差别。
方法4、先配置全局数据源,然后再在<Context>应用中链接到全局数据源,在server.xml中的<GlobalNamingResources>元素中配置数据源(数据源配置见上文)成全局数据源,然后在<Context>元素链接到该资源。另外,从前面方法1、方法2、方法3可以看出,<Context>位置可有三个,那么在<Context>元素链接到全局数据源的位置时,<Context>的位置可有两个如下:
1、<Context>位置与方法2相同,在tomcat\conf\context.xml的Context中增加:
<ResourceLink global="jdbc/mydb" name="jdbc/mydb" type="javax.sql.DataSource"/>
2、<Context>位置与方法3相同,在tomcat\webapps\myapp\META-INF\context.xml的Context中增加:
<ResourceLink global="jdbc/mydb" name="jdbc/mydb" type="javax.sql.DataSource"/>
步骤二、
应用发布目录下\web-inf\web.xml文件中配置该数据源的引用<resource-ref>元素(注意位置,一般放在<web-app>根元素中最后面,详细参考dtd文件)。我在如上所示环境实际测试时发现,此文件可有可无。有的文章说配置了可能会更稳定,未及考证。如下:
<resource-ref>
<description>DataSource Connection Pool</description>
<res-ref-name>P3</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
步骤三、
在java类中或者jsp中获取JNDI数据源,示例代码如下:
Context initContext = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/P3");
Connection conn = dataSource.getConnection();
上面DataSource dataSource = (DataSource) context.lookup("java:comp/env/P3");可分解为两步:
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource dataSource = (DataSource)envContext.lookup("P3");
Connection conn = dataSource .getConnection();
这里说明一下,"java:/comp/env":
ENC的概念:
The application component environment is referred to as the ENC, the enterprise naming context.
应用组件的业务逻辑应该是ENC中取得对象。组件提供者使用标准的部署描述符指定必需的ENC入口。这些ENC入口是运行时组件所依赖的资源等信息。
一个应用组件实例使用JNDI定位ENC。ENC的标准JNDI CONTEXT是:java:/comp/env
详细见:http://hi.baidu.com/frilee/blog/item/28cf29899811c6b60f24442c.html
还说明一下:"P3"是我自己定义的数据源名,习惯性的命名是"jdbc/mydatesourcename",所已看到的数据源名示例大都有个"jdbc/"在前面。
配置实例:
步骤一实例:D:\Tomcat5.0.28\conf\Catalina\localhost\testconn.xml文件代码如下,如将此应用testconn放到D:\Tomcat5.0.28\webapps目录下,只需去掉此文件中的<Context >中的 docBase="d:\testconn" 属性。
----------------------------------------------------------------------------------------------------------------------
<Context path="/testconn" docBase="d:\testconn" debug="0" privileged="true">
<Resource name="P3" auth="Container" type="javax.sql.DataSource"/>
<ResourceParams name="P3">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>50</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>5</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<parameter>
<name>username</name>
<value>zfmi</value>
</parameter>
<parameter>
<name>password</name>
<value>zfmi</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@192.168.9.111:1521:ZFMI</value>
</parameter>
</ResourceParams>
</Context>
----------------------------------------------------------------------------------------------------------------------
步骤二实例:D:\testconn\WEB-INF\web.xml文件
----------------------------------------------------------------------------------------------------------------------
<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<resource-ref>
<description>DataSource Connection Pool</description>
<res-ref-name>P3</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
----------------------------------------------------------------------------------------------------------------------
步骤三实例:D:\testconn\conn.jsp文件
----------------------------------------------------------------------------------------------------------------------
<%@ page import="java.io.*" %>
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<%@ page contentType="text/html; charset=gb2312" %>
<%
Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:comp/env/P3");
Connection conn = dataSource.getConnection();
System.out.println(dataSource+"\n111");
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from tb_ply_base where rownum< 500";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){
%>
<%=rs.getString(2)%><br>
<%}%>
<%
rs.close();
stmt.close();
conn.close();
%>
----------------------------------------------------------------------------------------------------------------------
出现问题:
本人测试很多方法,除开之前忘记放jdbc驱动包到合适位置报错,一般配置不成功大都报如下错误:
javax.servlet.ServletException: Cannot create JDBC driver of class ' for connect URL 'null'
补充说明:
上面提供的各种配置方法源于网上搜集后按其原理总结,仅供大家探讨。故不能保证在所有环境和tomcat版本下成功。此文章提供本人配置成功实例,以供大家参考。如有不足之处,请不吝指教。
转载请注明:转自:飞上墙的猫http://hi.baidu.com/suofang/blog/item/35fd3dad7862f30f4b36d6f9.html
参考文章:
tomcat5.5中jndi 各种配置方式 分析总结 [转]:
http://hi.baidu.com/suofang/blog/item/f21a4554e81d5852564e002a.html
攻破JNDI连接池(Tomcat5.5下通过管理界面配置连接池):
http://hi.baidu.com/dburu/blog/item/1b0037a4d63d43f69052ee0e.html
如何定义JNDI数据源:
http://blog.csdn.net/jvincent/archive/2007/06/27/1668605.aspx
tomcat的JNDI数据源绑定:
http://blog.zol.com.cn/132/article_131266.html
META-INF/context.xml:http://hi.baidu.com/renyijiu/blog/item/3de9b9ad204baf0c4b36d6ac.html
在TOMCAT中使用JNDI连接数据源:
http://www.cnblogs.com/willpower/archive/2008/04/30/1177720.html
Tomcat5.5下使用JNDI数据源:
http://hi.baidu.com/xieguojun2008/blog/item/794f88cea4fb513cb600c8b0.html
JNDI与数据源:
http://databclar.bokee.com/viewdiary.13158658.html