Aug 13

Servlet通过Tomcat6的JNDI Resources配置获取Data Source数据库连接池 不指定

ljh , 09:52 , JAVA SSH学习 , 评论(0) , 引用(0) , 阅读(1482) , Via 本站原创 | |

以一个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>

发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]