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资源,不知道这段代码具体有什么作用。