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>
<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: 不填
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>
<?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
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>
<%@ 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>
<?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: 不填
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>
<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>
- lt;/resource-ref>
<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资源,不知道这段代码具体有什么作用。 (责任编辑:admin) |