Tomcat5.0.28下的jndi数据源配置

环境

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

你可能感兴趣的:(java,oracle,tomcat,jdbc,application,import)