tomcat5.5的JNDI设置,主要注意的两点:
1) 驱动程序在server中所放的位置。
2) 配置
驱动程序应该放在${TOMCAT_HOME}\common\lib里面,我放到过${TOMCAT_HOME}\server\lib及${TOMCAT_HOME}\shared\lib中过,都不能成功运行.
配置文件中添加JNDI有好几种方式,不过以下这种方式比较通用一点.
${TOMCAT_HOME}\conf\context.xml中如下设置:
<Context>
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<Resource name="jdbc/test"
type="javax.sql.DataSource"
password=""
driverClassName="com.mysql.jdbc.Driver"
maxIdle="2"
maxWait="50"
username="root"
url="jdbc:mysql://localhost:3306/mynews"
maxActive="100"/>
</Context>
测试程序调用时如下:
<%@page import="java.util.*,javax.naming.*,java.sql.*,javax.sql.*"%>
<%@page contentType="text/html;charset=utf-8"%>
<%
Context ctx = new InitialContext();
String jndiLookUp = "java:comp/env/jdbc/test";
DataSource ds =(DataSource) ctx.lookup(jndiLookUp);
Connection con = ds.getConnection();
ResultSet rs =null;
Statement stmt =null;
try{
stmt =con.createStatement();
rs = stmt.executeQuery("select * from XXX");
while(rs.next())
{
System.out.println(rs.getString(1));
}
}catch(Exception e)
{
e.printStackTrace();
}finally{
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(con!=null)
con.close();
}
%>
注意jndi的调用中用的是"java:comp/env/jdbc/test".
在程序的web.xml中有这样的定义:
<resource-ref>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
java:comp/env是组件的JNDI上下文的名字.
(实际上这个上下文也作为一种资源来处理了,资源查找的过程可以是这样:
jndictxt = ctxt.lookup("java:comp/env")然后用这个jndictxt来查找资源,
ref = jndictxt.lookup("jdbc/test")。)
jdbc/test是资源引用的JNDI名(The jdbc/test string is the JNDI name for the resource reference,这句话可能意味着资源引用实际上也跟资源一样处理成一种JNDI绑定对象了,但是实际上应该不是这样,因为在部署描述符中它是引用名元素。因为译者也不是高手,所以这里的具体实现细节有待读者自己研究了:)所以JDBC的DataSource对象的JNDI名就存储在java:comp/env/jdbc的上下文子对象中。(组件运行环境的上下文层次需要进一步了解)
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public static DataSource getDataSource(String dataSourceName){
Context initCtx;
try {
initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
return (DataSource)envCtx.lookup(dataSourceName);
} catch (NamingException e) {
e.printStackTrace();
}
return null;
}