tomcat7的jndi配置有多种方式,相对对来说也比较简单。下面介绍我在一次工作中使用的方式。
tomcat version: apache-tomcat-7.0.61
1. 添加数据库驱动: ojdbc6.jar
2. 找到tomcat原始配置文件:%tomcat_home%/conf/context.xml,打开
<?xml version='1.0' encoding='utf-8'?>
<Context>
<!--
省略其他配置信息
-->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>
3. zaicontext.xml文件的Context中添加Resource节点(JNDI的数据源节点),配置后的文件如下:
<?xml version='1.0' encoding='utf-8'?>
<Context>
<!--
省略其他配置信息
-->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource
name="java:/SCPRD_WMWHSE1"
auth="Container"
type="javax.sql.DataSource"
maxIdle="100"
maxActive="100"
maxWait="10000"
timeBetweenEvictionRunsMillis="300000"
username="wmwhse1"
password="WMwhSql1"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@haibei.synnex.com:1521:SCPRD"
/>
</Context>
4. 编写一个jsp页面测试连接情况:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import=" java.util.*,java.sql.*" %>
<%@ page import="java.util.Hashtable,javax.sql.DataSource " %>
<%@ page import=" javax.naming.Context,javax.naming.InitialContext" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</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">
</head>
<body>
<%
try{
out.println("连接开始....");
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("java:/SCPRD_WMWHSE1");
Connection conn = ds.getConnection();
if(conn != null){
out.println("jndi连接成功!");
}
}catch(Exception e){
e.printStackTrace();
out.println("jndi连接出错!");
}finally{
out.println("连接结束....");
}
%>
</body>
</html>
5. 测试结果如下:
连接开始....
jndi链接成功!
测试结束....
6. 总结注意事项:
6.1 数据源获取方式错误
a)
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("java:/SCPRD_WMWHSE1");
Connection conn = ds.getConnection();
b)
InitialContext ic=new InitialContext();
DataSource ds=(DataSource) ic.lookup(dataSource);
这此次测试中,如果使用b)方式则会报一下错误:
javax.naming.NameNotFoundException: Name [SCPRD_WMWHSE1] is not bound in this Context. Unable to find [SCPRD_WMWHSE1].
at org.apache.naming.NamingContext.lookup(NamingContext.java:819)
at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:156)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:96)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
6.2 oracle驱动错误,遇上这个问题,直接换一个oracle驱动即可,因为有些版本的oracle驱动有这bug。
javax.management.MalformedObjectNameException: Invalid character '
' in value part of property
at javax.management.ObjectName.construct(ObjectName.java:602)
at javax.management.ObjectName.<init>(ObjectName.java:1403)
到此tomcat7简单的jndi配置就完成了,希望能报到有需要的朋友。