代码之家  ›  专栏  ›  技术社区  ›  Adil Mehmood

jdbc,jndi与Tomcat 6.0.26的问题

  •  3
  • Adil Mehmood  · 技术社区  · 14 年前

    您好,我正在开发一个webapp,它需要使用jndi使用企业JDBC类建立一个数据源。我使用的是netbeans 6.9捆绑的tomcat(6.0.26 app)服务器和mysql 5.xx。真正的问题是,我仍然可以从我的jsp页面中显示的关系中看到数据库值,而在tomcat初始化期间,它说像这样:

    . .

    SEVERE: Servlet.service() for servlet jsp threw exception
    java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp.BasicDataSource cannot be cast to javax.naming.Context
            at org.apache.jsp.Hello_jsp._jspService(Hello_jsp.java:141)
            at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
            at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
            at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
            at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
            at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
            at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
            at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
            at java.lang.Thread.run(Thread.java:619)
    Jul 25, 2010 1:28:25 AM org.apache.catalina.core.ApplicationContext log
    INFO: SessionListener: contextDestroyed()
    Jul 25, 2010 1:28:25 AM org.apache.catalina.core.ApplicationContext log
    INFO: ContextListener: contextDestroyed()
    Jul 25, 2010 1:28:32 AM org.apache.catalina.core.ApplicationContext log
    INFO: ContextListener: contextInitialized()
    Jul 25, 2010 1:28:32 AM org.apache.catalina.core.ApplicationContext log
    INFO: SessionListener: contextInitialized()
    Jul 25, 2010 1:28:40 AM org.apache.catalina.core.StandardWrapperValve invoke
    SEVERE: Servlet.service() for servlet jsp threw exception
    javax.naming.NameNotFoundException: Name nexusirm is not bound in this Context
            at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
            at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
            at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
            at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
            at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
            at org.apache.naming.NamingContext.lookup(NamingContext.java:140)
            at org.apache.naming.NamingContext.lookup(NamingContext.java:781)
            at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
            at org.apache.naming.SelectorContext.lookup(SelectorContext.java:152)
            at javax.naming.InitialContext.lookup(InitialContext.java:392)
            at org.apache.jsp.Hello_jsp._jspService(Hello_jsp.java:141)
            at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
            at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
            at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
            at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
            at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
            at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
            at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
            at java.lang.Thread.run(Thread.java:619)
    Jul 25, 2010 1:29:50 AM org.apache.catalina.core.StandardWrapperValve invoke
    SEVERE: Servlet.service() for servlet jsp threw exception
    javax.naming.NameNotFoundException: Name jdbc is not bound in this Context
            at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
            at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
            at org.apache.naming.SelectorContext.lookup(SelectorContext.java:152)
            at javax.naming.InitialContext.lookup(InitialContext.java:392)
            at org.apache.jsp.Hello_jsp._jspService(Hello_jsp.java:143)
            at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
            at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
            at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
            at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
            at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859)
            at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
            at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555)
            at java.lang.Thread.run(Thread.java:619)
    Jul 25, 2010 1:30:10 AM org.apache.catalina.core.ApplicationContext log
    

    . .

    我的/WEB-INF/WEB.xml中有以下内容

    <resource-ref>
             <res-ref-name>jdbc/NexusIRM</res-ref-name>
             <res-type>javax.sql.DataSource</res-type>
             <res-auth>Container</res-auth>
             <res-sharing-scope>Shareable</res-sharing-scope> 
    </resource-ref>
    

    以及my/meta-inf/context.xml中的以下内容

     <Resource name="jdbc/NexusIRM"
               auth="Container"
               type="javax.sql.DataSource"
               driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/nexusirm"
               username="root"
               password=""
               maxActive="20"
               maxIdle="30"
               maxWait="-1"
    
     />
    

    我的应用程序代码如下:

                    <%
     try{
    
    Context initCtx = new InitialContext();
    
    DataSource ds = (DataSource)
      initCtx.lookup("java:comp/env/jdbc/NexusIRM");
    
    Connection conn=ds.getConnection();
    
    Statement stmt=conn.createStatement();
    ResultSet rs=stmt.executeQuery("SELECT * FROM irm_gtresult");
    
    if(rs.next())
        {
        for(int i=1;i<9;i++){
    out.write(rs.getString(i));
    }
    }
    conn.close();
    }catch(SQLException e)
    {out.write(e.getMessage());
    e.printStackTrace();}
    
    %>
    

    我只是好奇为什么在应用程序完美执行时抛出这些异常!

    1 回复  |  直到 11 年前
        1
  •  1
  •   Romain Hippeau    14 年前

    试试这个…

    Connection conn;
    try
    {   
        // Obtain our environment naming context
        Context initCtx = new InitialContext();
        Context envCtx = (Context) initCtx.lookup("java:comp/env");
    
        // Look up our data source
        DataSource ds = (DataSource)
          envCtx.lookup("jdbc/NexusIRM");
    
        // Allocate and use a connection from the pool
        Connection conn = ds.getConnection();
        ... use this connection to access the database ...
    }
    finally
    {
       if(conn != null)
           conn.close();
    }
    

    注意:最后一定要关闭!!!!