Tomcat5.0.28 + oracle9i的JNDI配置

 

        JNDI 配置弄得我非常郁闷!配了两三天,报了一堆错误,凡是可能出现的错误,我恐怕都碰了个遍,在碰个头破血流的情况下,算是初步摸清楚状况了,下面描述一下根据自己理解的配置步骤。

 

    我使用的是 Tomcat5.0.28+oracel9i tomcat5.5 以上的版本其实与这个类似,只是写法上有些不同,在配置 resource 的时候, tomcat5.5 的参数是写在 resource 标签内的。原理上理解了也就好配置了。

从我的理解来说, jndi 配置应该有两种情况,一种是由 tomcat 容器管理的全局性 resource 资源,另一种是每个应用自己管理的单个 resource 资源。

 

准备工作:

1 orcale jdbc 驱动放入到 %CATALINA_HOME%/common/lib 下, orcale jdbc 驱动是 ojdbc14.jar ,这个 jar 包可以在 orcale 的安装目录下找到,具体位置在 ..\ oracle\ora92\jdbc\lib下。

2 部署自己的应用,这一步不是必须的,也可以在配置完 jndi 资源后部署

 

先说第一种,全局性的 resource 资源 。这种配置是由 tomcat 容器管理的,如果 webapps 下面的应用想要使用这个资源,需要先与之相连接,获取到该资源,再引用它才能使用。具体步骤如下:

 

1 注册全局性的 resource 资源

全局性的 resource 资源是在 tomcat %CATALINA_HOME% /conf/server.xml 中进行注册的,注册过程通过在 server.xml 中的 <GlobalNamingResources>下加入如下代码:

<Resource name="jndi/jdbc" type="javax.sql.DataSource"/>
    <ResourceParams name="jndi/jdbc">
      <parameter>
        <name>url</name>
        <value>jdbc:oracle:thin:@127.0.0.1:1521:SID</value>
      </parameter>
      <parameter>
        <name>password</name>
        <value>your password</value>
      </parameter>
      <parameter>
        <name>maxActive</name>
        <value>4</value>
      </parameter>
      <parameter>
        <name>maxWait</name>
        <value>5000</value>
      </parameter>
      <parameter>
        <name>driverClassName</name>
        <value>oracle.jdbc.driver.OracleDriver</value>
      </parameter>
      <parameter>
        <name>username</name>
        <value>your username</value>
      </parameter>
      <parameter>
        <name>maxIdle</name>
        <value>2</value>
      </parameter>
    </ResourceParams>
 

注意:如果是通过浏览器访问 tomcat 的控制台配置的话,进入 Resources 下的 Data Sources 中新建一个 Data Source ,填入下面的内容:

JNDI Name: jndi/jdbc
Data Source URL: jdbc:oracle:thin:@127.0.0.1:1521:SID
JDBC Driver Class: oracle.jdbc.driver.OracleDriver
User Name: yourname
Password: yourpassword
Max. Active Connections: 4(根据需要填写)
Max. Idle Connections: 2(根据需要填写)
Max. Wait for Connection: 5000(根据需要填写)
Validation Query: 不填
 

这两种的效果是一样的。

 

2 将该资源连接到自己的应用上。在 %CATALINA_HOME% / conf / Catalina / localhost下有你的应用的配置文件, YourAppName.xml ,如果没有,手动创建一个就可以。一般在控制台配置的话, tomcat 会自动创建该文件。内容如下:

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="YourAppName" path="/YourAppName" workDir="work\Catalina\localhost\YourAppName">

 <ResourceLink name="jndi/jdbc"  global="jndi/jdbc"  type="javax.sql.DataSource"/>

</Context>
 

如果通过 tomcat 控制台配置的话,进入 Service Host 里面的应用 Context(/YourAppName) (这里要保证你的应用已经提前部署到 tomcat 中了)在 Resource Links 中新建一个 link ,填入下面的内容:

 

Name: jdbc/jndi
Global: jdbc/jndi
Type: javax.sql.DataSource
 

 

3 用你的应用测试一下,我这里可以写了个 jsp 程序测试的,如下:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@page import="javax.naming.Context"%>
<%@page import="javax.sql.DataSource" %>
<%@page import="javax.naming.InitialContext"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.ResultSet"%>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>Test JNDI</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body> 
    giTest JNDI <br>
    <%
        	
    	Context cxt = new InitialContext();
    	DataSource ds = null;
    	ds = (DataSource)cxt.lookup("java:comp/env/jndi/jdbc");
   	System.out.println(ds); 
    	if(ds != null)
    	{
 	out.println(ds); 
    	try{
    		Connection con = ds.getConnection();
    		Statement stmt = con.createStatement();
    		ResultSet rst = stmt.executeQuery("select * from test");
    		while(rst.next())
    		out.println(rst.next());
    		
    	}catch(Exception e){
    		e.printStackTrace();
    	}
    	}
    	   	
     %>
  </body>
</html>
   

注意查找 jndi 的写法:java:comp/env/jndi/ jdbc 后面是你起的 jndi 名。

 

第二种,为单个应用配置 jndi 资源。 这种方式是由你的应用去管理 jndi 资源的。

 

1 tomcat 中你应用的配置文件中注册 jndi 资源,位置在 %CATALINA_HOME% / conf / Catalina / localhost /YourAppName.xml ,没有的话创建一个,内容如下:

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="YourAppName" path="/YourAppName" workDir="work\Catalina\localhost\YourAppName">    
    <Resource name="jndi/jdbc" type="javax.sql.DataSource"/>
    <ResourceParams name="jndi/jdbc">
      <parameter>
        <name>url</name>
        <value>jdbc:oracle:thin:@127.0.0.1:1521:SID</value>
      </parameter>
      <parameter>
        <name>password</name>
        <value>yourpassword</value>
      </parameter>
      <parameter>
        <name>maxActive</name>
        <value>4</value>
      </parameter>
      <parameter>
        <name>maxWait</name>
        <value>5000</value>
      </parameter>
      <parameter>
        <name>driverClassName</name>
        <value>oracle.jdbc.driver.OracleDriver</value>
      </parameter>
      <parameter>
        <name>username</name>
        <value>yourname</value>
      </parameter>
      <parameter>
        <name>maxIdle</name>
        <value>2</value>
      </parameter>
    </ResourceParams>
</Context>
 

注意:配置单个应用的 jndi 资源时,这里可以不用写 link 。如果使用控制台配置,直接进入 Service Host 里面的应用 Context(/YourAppName) (这里要保证你的应用已经提前部署到 tomcat 中了)在 Data Source 创建一个新的 Data Source ,输入如下内容:

 

JNDI Name: jndi/jdbc
Data Source URL: jdbc:oracle:thin:@127.0.0.1:1521:SID
JDBC Driver Class: oracle.jdbc.driver.OracleDriver
User Name: yourname
Password: yourpassword
Max. Active Connections: 4(根据需要填写)
Max. Idle Connections: 2(根据需要填写)
Max. Wait for Connection: 5000(根据需要填写)
Validation Query: 不填

2 测试连接,参考第一种配置方式的第三步(代码略)

 

局部的JNDI配置还有一种方式,即直接在server.xml中配置,但位置略有不同,即将下面的代码放在<HOST>标签中,这时,此时可以不需要你应用的配置文件( %CATALINA_HOME% / conf / Catalina / localhost /YourAppName.xml ),效果是一样的。

<Host>
......
<Context docBase="YourAppName" path="/YourAppName" workDir="work\Catalina\localhost\YourAppName">    
    <Resource name="jndi/jdbc" type="javax.sql.DataSource"/>
    <ResourceParams name="jndi/jdbc">
      <parameter>
        <name>url</name>
        <value>jdbc:oracle:thin:@127.0.0.1:1521:SID</value>
      </parameter>
      <parameter>
        <name>password</name>
        <value>yourpassword</value>
      </parameter>
      <parameter>
        <name>maxActive</name>
        <value>4</value>
      </parameter>
      <parameter>
        <name>maxWait</name>
        <value>5000</value>
      </parameter>
      <parameter>
        <name>driverClassName</name>
        <value>oracle.jdbc.driver.OracleDriver</value>
      </parameter>
      <parameter>
        <name>username</name>
        <value>yourname</value>
      </parameter>
      <parameter>
        <name>maxIdle</name>
        <value>2</value>
      </parameter>
    </ResourceParams>
 </Context>
</Host>
 

在尝试过这些之后,就会发现,实际上server.xml<HOST>标签下<context>就是为你的应用配置的内容。

 

最后有个问题:

很多地方在配置完上面的这些后,会在自己的应用中的web.xml加入引用JNDI资源的代码,即

 

 <resource-ref>
 <description>postgreSQL Datasource example</description>
 <res-ref-name>jdbc/jndi</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>

 但是我尝试了不加也可以访问到JNDI资源,不知道这段代码具体有什么作用。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值