准备条件:
1、jdk1.6(或jdk1.7)
2、tomcat6(或tomcat7)
3、数据库连接驱动,以mysql为例:mysql-connector-java-5.1.18.jar
配置jndi的步骤:
先来看非全局的配置方法(只有当前应用可以访问该jndi)
1、将数据连接驱动jar包拷贝到tomcat6下的lib目录下;
2、打开tomcat6下的conf目录下context.xml文件;
3、在<Context>......</Context>节点里添加如下代码:
<Context> <!-- Default set of monitored resources --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <!-- Uncomment this to enable Comet connection tacking (provides events on session expiration as well as webapp lifecycle) --> <!-- <Valve className="org.apache.catalina.valves.CometConnectionManagerValve" /> --> <!--JNDI配置--> <Resource name="jdbc/rpepTest" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="5000" username="testuser" password="testpass" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://10.111.222.333:3306/rpep?zeroDateTimeBehavior=convertToNull"/> </Context>
各参数说明:
name="jdbc/rpepTest" -------jndi的名称
auth="Container" ------- jndi的认证方式,可选Container或Application
type="javax.sql.DataSource" ------- jndi所使用的类
maxActive="100" ------- 最大活跃的连接数
maxIdle="30" ------- 最大空闲连接数
maxWait="5000" ------- 最大等待时间
username="testuser" ------- 数据库用户名
password="testpass" ------- 数据库密码
driverClassName="com.mysql.jdbc.Driver" ------- 数据库驱动
url="jdbc:mysql://10.111.222.333:3306/rpep?zeroDateTimeBehavior=convertToNull" ------- 数据库连接URL
4、在程序中使用jndi:
4.1.新建一个web工程test(注意jndi需要在tomcat容器里使用);
4.2 修改test工程的web.xml,添加如下代码:
<!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> <display-name>Archetype Created Web Application</display-name> <resource-ref> <description>MySQL DataSource</description> <res-ref-name>jdbc/rpepTest</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app>
4.3 编写测试类:
package com.mycom.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
/**
* 测试JNDI配置和连接
*
* @author guweiqiang
*/
public class TestJNDI {
private Connection getConnection() throws NamingException {
Connection conn = null;
String jndi = "jdbc/rpepTest";
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");// 固定,不需要修改
DataSource ds = (DataSource) envContext.lookup(jndi);
if (ds != null) {
try {
conn = ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
}
return conn;
}
public List<String> selectById(int id) {
Connection con = null;
try {
con = getConnection();
} catch (NamingException e1) {
e1.printStackTrace();
}
List<String> list = new ArrayList<String>();
String sql = "select * from rpep_activity where id=?";
try {
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
list.add(rs.getString(1));
list.add(rs.getString(2));
list.add(rs.getString(3));
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
public static void main(String[] args) {
new TestJNDI().selectById(100051);
}
}
4.4.再编写一个测试jsp:
<%@page import="com.mycom.test.TestJNDI"%>
<%
new TestJNDI().selectById(100051);
%>
<html>
<body>
<h2>Hello World!</h2>
</body>
</html>
启动tomcat,访问:http://127.0.0.1:8080/test/
测试结果:
100051
5.1测试
5.6测试
再来看全局的配置方法(所有应用都可以访问该jndi)
与非全局的配置基本相同,只是具体的数据源配置信息时配置在conf下的server.xml文件里,然后在context.xml里进行引用。
1. 同样需要将mysql驱动连接的jar拷贝到tomcat的lib目录下;
2. 打开tomcat的conf目录下的server.xml文件,将数据源配置添加到<GlobalNamingResources></GlobalNamingResources>节点下:
<GlobalNamingResources>
<!-- Editable user database that can also be used by
UserDatabaseRealm to authenticate users
-->
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
<!--JNDI配置-->
<Resource name="jdbc/rpepTest"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="5000"
username="testuser"
password="testpass"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://10.111.222.333:3306/rpep?zeroDateTimeBehavior=convertToNull"/>
</GlobalNamingResources>
3. 再在context.xml文件里添加全局引用:
<ResourceLink global="jdbc/rpepTest" name="jdbc/rpepTest1" type="javax.sql.DataSource"/>说明:jdbc/ rpepTest 是全局的JNDI,jdbc/ rpepTest1 是你的应用中使用的JNDI。
这一步也可以在应用程序的WebRoot\META-INF\下新建context.xml,然后中增加:
<ResourceLink global="jdbc/rpepTest" name="jdbc/rpepTest1" type="javax.sql.DataSource"/>以上配置完成之后,无需在web.xml里配置数据源引用了(配置了也没有作用)。
4. 测试过程同上。