Servlet通过Tomcat6的JNDI Resources配置获取Data Source数据库连接池
以一个Servlet为例子说明如何从Tomcat 6的JNDI Resources中获取Data Source对象。
--------------------------------------------------------------------------
环境:
JDK 1.6
Tomcat 6
Eclipse Galileo 3.5.1
组件:
sqljdbc4.jar(可从microsoft.com下载,用于连接SQL Server)
参考:
http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html
--------------------------------------------------------------------------
1、准备library.
Copy sqljdbc4.jar到Tomcat 6的lib目录:$CATALINA_HOME/lib, 在Eclipse创建一个Java Project,引用$CATALINA_HOME/lib/servlet-api.jar和sqljdbc4.jar。
2、编写Servlet
编写一个名为JNDITest的Servlet类,代码如下:package com.Test;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
public class JNDITest extends HttpServlet
{
public void doGet(HttpServletRequest request
,HttpServletResponse response) throws IOException
{
PrintWriter pw=response.getWriter();
try
{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)
envCtx.lookup("jdbc/DevDB");
Connection conn = ds.getConnection();
pw.write("Cool,Successful!</br>"+conn.toString()+"</br>");
conn.close();
}
catch(SQLException exSql)
{
pw.write("SQL Exception:"+exSql.getMessage()+"</br>");
}
catch(NamingException exNam)
{
pw.write("Naming Exception:"+exNam.getMessage()+"</br>");
}
finally
{
pw.flush();
pw.close();
pw=null;
}
}
}.
代码中创建了一个简单的Servlet,在Servlet的get方法中,通过InitialContext从JNDI的名为java:comp/env(Java Environment Naming Context)中查找名为jdbc/DevDB的Resource,然后把查找到的Resource转换为Data Source,然后从该Data Source中得到用于连接数据库的Connection对象,如果获取成功,则在Web页面中输出Connection的toString(),否则输出错误信息。
若想从JNDI中查找到相应名称的Resource,则要事先在$CATALINA_HOME/conf/server.xml或META-INF/context.xml中进行配置。
编译以上代码得到.class文件。
3、发布Servlet
在$CATALINA_HOME/webapps(默认WEB ROOT)路径下创建名为jndi的文件夹,然后在jndi下创建WEB-INF文件夹,把编译后的.class文件按package的路径Copy到WEB-INF下的classes目录中,根据package配置,完整路径为$CATALINA_HOME/webapps/jndi/WEB-INF/classes/com/Test/JNDITest.class;在WEB-INF下创建名为web.xml的xml文件,内容如下:<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>JNDITest</servlet-name>
<servlet-class>com.Test.JNDITest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JNDITest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<resource-ref>
<res-ref-name>jdbc/DevDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app> web.xml配置文件中映射了Servlet,并通过<resource-ref>节声明了我们要引用的Resource,实践证明在Tomcat6中可以不用在web.xml中声明<resource-ref>节。
web.xml配置完成后,可以在浏览器中通过http://localhost:8080/jndi访问JNDITest Servlet,只不过还没有声明相应的资源,会看到相应的错误信息。
4、配置JNDI Resource
Tomcat中有两个地方可以配置JNDI资源,一个是Web Application下的META-INF/context.xml文件,一个是$CATALINA_HOME/conf/server.xml文件。
方法一:在context.xml文件中配置:
在$CATALINA_HOME/jndi/META-INF目录下创建context.xml文件,内容如下:<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/DevDB"
auth="Container"
type="javax.sql.DataSource"
username="testuser"
password="testpass"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://193.168.1.3:41433;databaseName=DevDB"
maxActive="8"
maxIdle="4"/>
</Context>该文件中定义了一个名为jdbc/DevDB的Resource,并配置了相关的数据库连接属性及连接池信息。
META-INF下的context.xml文件在运行时会被复制到$CATALINA_HOME/conf/[Engine name]/[Host name]/[Path name].xml文件,相对于本例就是:$CATALINA_HOME/conf/Catalina/localhost/jndi.xml。
方法二:在server.xml文件中配置:
也可以把JNDI Resources配置在$CATALINA_HOME/conf/server.xml文件中。配置在<Server>/<Service>/<Engine>/<Host>/<Context>节点下,需指定URL访问路径,如:...
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/jndi" >
<Resource name="jdbc/DevDB"
auth="Container"
type="javax.sql.DataSource"
username="testuser"
password="testpass"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://192.168.1.3;databaseName=DevDB"
maxActive="8"
maxIdle="4"/>
</Context>
</Host>
</Engine>
</Service>
</Server>.
JNDI Resource配置完成后,访问Servlet所在的URL,就可以看到想要输出的"Cool,Successful!..."等信息了,表明已成功从连接池中取到数据库连接。
注:META-INF下的context.xml和server.xml中对应于同一web path的Context节对同一个属性最好不要同时配置,否则会产生意想不到的结果。
把JNDI Resource配置为Global:
除上面的两种配置方法外,还可以在$CATALINA_HOME/conf/server.xml中的<Server>/<GlobalNamingResources>节配置Resource为Global Source,然后在$CATALINA_HOME/conf/server.xml中的Context节或META-INF/context.xml文件中通过ResourceLink进行引用,如下,Global Resource Name为jdbc/DevDBGlobal:...
<Server>
...
<GlobalNamingResources>
<Resource name="jdbc/DevDBGlobal"
auth="Container"
type="javax.sql.DataSource"
username="testuser"
password="testpass"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://192.168.1.3,41433;databaseName=DevDB"
maxActive="8"
maxIdle="4"/>
</GlobalNamingResources>
... 在server.xml中的引用:...
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/jndi" >
<ResourceLink name="jdbc/DevDB" global="jdbc/DevDBGlobal" type="javax.sql.DataSource" />
</Context>
</Host>
</Engine>
</Service>
</Server> 在context.xml中的引用:<?xml version="1.0" encoding="UTF-8"?>
<Context>
<ResourceLink name="jdbc/DevDB" global="jdbc/DevDBGlobal" type="javax.sql.DataSource" />
</Context>
MyEclipse不编译
java 在使用mysq



