Name [jdbc/mydb] is not bound in this Context

橙三吉。 提交于 2019-11-26 09:36:23

问题


I see this question was raised several times already and I went through all of them. But I am still unable to fix my problem.

Could anyone help me pinpoint what I am doing wrong?

I get the following error message when I try to access database.jsp:

    HTTP Status 500 - An exception occurred processing JSP page /database.jsp at line 24

type Exception report

message An exception occurred processing JSP page /database.jsp at line 24

description The server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: An exception occurred processing JSP page /database.jsp at line 24

21:         <%
22:                 Context init = new InitialContext();
23:                 Context env = (Context) init.lookup(\"java:/comp/env/\");
24:                 DataSource data = (DataSource) env.lookup(\"jdbc/mydb\");
25:                 Connection conn = data.getConnection();
26:                 Statement stmt = conn.createStatement();
27: 


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:455)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

javax.servlet.ServletException: javax.naming.NameNotFoundException: Name [jdbc/mydb] is not bound in this Context. Unable to find [jdbc].
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:916)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:845)
    org.apache.jsp.database_jsp._jspService(database_jsp.java:185)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Here are a few pieces of information on my installation: My computer is running on Mac OS X. The web server is Tomcat version 7.0.52, installed under /Users/username/Dropbox/Server/apache-tomcat-7.0.52. I am trying to run Derby 10.10.1.1 as an embedded database. I copied derby.jar under the folder /Users/username/Dropbox/Server/apache-tomcat-7.0.52/lib. I wrote the following in my PATH file (I am not sure it is relevant):

export DERBY_HOME=/Users/username/Dropbox/Server/apache-tomcat-7.0.52/lib
export PATH=$PATH:$DERBY_HOME/bin

Here is the content of the web.xml file:

<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>
<web-app xmlns=\"http://java.sun.com/xml/ns/javaee\"
  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
  xsi:schemaLocation=\"http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd\"
  version=\"3.0\"
  metadata-complete=\"true\">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
    <resource-ref>
       <description>DB Connection</description>
       <res-ref-name>jdbc/mydb</res-ref-name>
       <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
    </resource-ref>
  </description>

</web-app>

context.xml

<?xml version=\'1.0\' encoding=\'utf-8\'?>
<!-- The contents of this file will be loaded for each web application -->
<Context>
    <!-- Default set of monitored resources -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
</Context>

server.xml

<?xml version=\'1.0\' encoding=\'utf-8\'?>
<Server port=\"8005\" shutdown=\"SHUTDOWN\">
  <Listener className=\"org.apache.catalina.core.AprLifecycleListener\" SSLEngine=\"on\" />
  <Listener className=\"org.apache.catalina.core.JasperListener\" />
  <Listener className=\"org.apache.catalina.core.JreMemoryLeakPreventionListener\" />
  <Listener className=\"org.apache.catalina.mbeans.GlobalResourcesLifecycleListener\" />
  <Listener className=\"org.apache.catalina.core.ThreadLocalLeakPreventionListener\" />

  <GlobalNamingResources>
        <!-- Added by LC #2 @19/3/2014 -->
            <!-- Global Datasource for Derby mydb database -->
            <Resource name=\"jdbc/mydb\"
                     type=\"javax.sql.DataSource\"  auth=\"Container\"
                     description=\"Derby database for Stocktails\"
                     maxActive=\"20\" maxIdle=\"10\" maxWait=\"-1\"
                     username=\"\" password=\"\" 
                     driverClassName=\"org.apache.derby.jdbc.EmbeddedDriver\"
                     url=\"jdbc:derby:/Users/username/Dropbox/Server/apache-tomcat-7.0.52/databases/mydb\"/>
        <!-- End #2 -->

  </GlobalNamingResources>

  <Service name=\"Catalina\">

    <Connector port=\"8080\" protocol=\"HTTP/1.1\"
               connectionTimeout=\"20000\"
               redirectPort=\"8443\" />

    <Connector port=\"8009\" protocol=\"AJP/1.3\" redirectPort=\"8443\" />

    <Engine name=\"Catalina\" defaultHost=\"localhost\">
      <Realm className=\"org.apache.catalina.realm.LockOutRealm\">
        <Realm className=\"org.apache.catalina.realm.UserDatabaseRealm\"
               resourceName=\"UserDatabase\"/>
      </Realm>

      <Host name=\"localhost\"  appBase=\"webapps\"
            unpackWARs=\"true\" autoDeploy=\"true\">

        <Valve className=\"org.apache.catalina.valves.AccessLogValve\" directory=\"logs\"
               prefix=\"localhost_access_log.\" suffix=\".txt\"
               pattern=\"%h %l %u %t &quot;%r&quot; %s %b\" />

        <!-- Added by LC #1 @19/3/2014 -->
        <Context
           docBase=\"ROOT\" path=\"\" debug=\"0\"
           reloadable=\"true\">
        </Context>
        <!-- End #1 -->

      </Host>
    </Engine>
  </Service>
</Server>

Finally, here is the database.jsp page:

<html>
<head>
  <title>Quote Query</title>
</head>
<body>
  <h1>retrieve stock quotes</h1>
  <h3>Choose Ticker(s):</h3>
  <form method=\"get\">
    <input type=\"checkbox\" name=\"ticker\" value=\"AAPL\">AAPL
    <input type=\"checkbox\" name=\"ticker\" value=\"MSFT\">MSFT
    <input type=\"submit\" value=\"Query\">
  </form>

  <%
    String[] tickers = request.getParameterValues(\"ticker\");
    if (tickers != null) {
  %>


        <%@ page import=\"javax.naming.*,java.sql.*,javax.sql.*\" %>
        <%
                Context init = new InitialContext();
                Context env = (Context) init.lookup(\"java:/comp/env/\");
                DataSource data = (DataSource) env.lookup(\"jdbc/mydb\");
                Connection conn = data.getConnection();
                Statement stmt = conn.createStatement();

                String sqlStr = \"SELECT * FROM Quotes WHERE Ticker IN (\";
                sqlStr += \"\'\" + tickers[0] + \"\'\";  // First ticker
                for (int i = 1; i < tickers.length; ++i) {
                   sqlStr += \", \'\" + tickers[i] + \"\'\";  // Subsequent tickers need a leading commas
                }
                sqlStr += \") ORDER BY Date ASC\";

                // for debugging
                System.out.println(\"Query statement is \" + sqlStr);

                ResultSet rset = stmt.executeQuery(sqlStr);
        %>

      <hr>
      <form method=\"get\" action=\"quotes.jsp\">
        <table border=1 cellpadding=5>
          <tr>
            <th>Ticker</th>
            <th>Date</th>
            <th>PriceOpen</th>
            <th>PriceHigh</th>
            <th>PriceLow</th>
            <th>PriceClose</th>
            <th>Volume</th>
            <th>PriceAdjClose</th>
          </tr>
  <%
      while (rset.next()) {
        int id = rset.getInt(\"id\");
  %>
          <tr>
            <td><input type=\"checkbox\" name=\"id\" value=\"<%= id %>\"></td>
            <td><%= rset.getString(\"Ticker\") %></td>
            <td><%= rset.getString(\"Date\") %></td>
            <td>$<%= rset.getInt(\"PriceOpen\") %></td>
            <td><%= rset.getInt(\"PriceHigh\") %></td>
            <td><%= rset.getString(\"PriceLow\") %></td>
            <td><%= rset.getString(\"PriceClose\") %></td>
            <td>$<%= rset.getInt(\"Volume\") %></td>
            <td><%= rset.getInt(\"PriceAdjClose\") %></td>
          </tr>
  <%
      }
  %>
        </table>
        <br>
        <input type=\"submit\" value=\"Order\">
        <input type=\"reset\" value=\"Clear\">
      </form>
      <a href=\"<%= request.getRequestURI() %>\"><h3>Back</h3></a>
  <%
      rset.close();
      stmt.close();
      conn.close();
    }
  %>
</body>
</html>

Log

Mar 21, 2014 7:57:26 AM org.apache.catalina.core.AprLifecycleListener init
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /Users/lcazarre/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
Mar 21, 2014 7:57:26 AM org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property \'debug\' to \'0\' did not find a matching property.
Mar 21, 2014 7:57:28 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler [\"http-bio-8080\"]
Mar 21, 2014 7:57:28 AM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler [\"ajp-bio-8009\"]
Mar 21, 2014 7:57:28 AM org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 3227 ms
Mar 21, 2014 7:57:28 AM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Catalina
Mar 21, 2014 7:57:28 AM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.52
Mar 21, 2014 7:57:28 AM org.apache.catalina.realm.UserDatabaseRealm startInternal
SEVERE: Exception looking up UserDatabase under key UserDatabase
javax.naming.NameNotFoundException: Name [UserDatabase] is not bound in this Context. Unable to find [UserDatabase].
    at org.apache.naming.NamingContext.lookup(NamingContext.java:819)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
    at org.apache.catalina.realm.UserDatabaseRealm.startInternal(UserDatabaseRealm.java:253)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.realm.CombinedRealm.startInternal(CombinedRealm.java:201)
    at org.apache.catalina.realm.LockOutRealm.startInternal(LockOutRealm.java:120)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1109)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:300)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:731)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:689)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:321)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)

Mar 21, 2014 7:57:28 AM org.apache.catalina.realm.CombinedRealm startInternal
SEVERE: Failed to start \"org.apache.catalina.realm.UserDatabaseRealm/1.0\" realm
org.apache.catalina.LifecycleException: Failed to start component [Realm[UserDatabaseRealm]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.realm.CombinedRealm.startInternal(CombinedRealm.java:201)
    at org.apache.catalina.realm.LockOutRealm.startInternal(LockOutRealm.java:120)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1109)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:300)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:731)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:689)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:321)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:455)
Caused by: org.apache.catalina.LifecycleException: No UserDatabase component found under key UserDatabase
    at org.apache.catalina.realm.UserDatabaseRealm.startInternal(UserDatabaseRealm.java:262)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    ... 17 more

Mar 21, 2014 7:57:31 AM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /Users/lcazarre/Dropbox/Work/MS50/COMSM0104/Server/apache-tomcat-7.0.52/webapps/docs
Mar 21, 2014 7:57:32 AM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /Users/lcazarre/Dropbox/Work/MS50/COMSM0104/Server/apache-tomcat-7.0.52/webapps/examples
Mar 21, 2014 7:57:33 AM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /Users/lcazarre/Dropbox/Work/MS50/COMSM0104/Server/apache-tomcat-7.0.52/webapps/host-manager
Mar 21, 2014 7:57:33 AM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deploying web application directory /Users/lcazarre/Dropbox/Work/MS50/COMSM0104/Server/apache-tomcat-7.0.52/webapps/manager
Mar 21, 2014 7:57:34 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler [\"http-bio-8080\"]
Mar 21, 2014 7:57:34 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler [\"ajp-bio-8009\"]
Mar 21, 2014 7:57:34 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 6321 ms

Thanks, LC


回答1:


You need a ResourceLink in your META-INF/context.xml file to make the global resource available to the web application.

 <ResourceLink name="jdbc/mydb"
             global="jdbc/mydb"
              type="javax.sql.DataSource" />



回答2:


For those who use Tomcat with Bitronix, this will fix the problem:

The error indicates that no handler could be found for your datasource 'jdbc/mydb', so you'll need to make sure your tomcat server refers to your bitronix configuration files as needed.

In case you're using btm-config.properties and resources.properties files to configure the datasource, specify these two JVM arguments in tomcat:

(if you already used them, make sure your references are correct):

  • btm.root
  • bitronix.tm.configuration

e.g.

-Dbtm.root="C:\Program Files\Apache Software Foundation\Tomcat 7.0.59" 
-Dbitronix.tm.configuration="C:\Program Files\Apache Software Foundation\Tomcat 7.0.59\conf\btm-config.properties" 

Now, restart your server and check the log.




回答3:


you put resource-ref in the description tag in web.xml



来源:https://stackoverflow.com/questions/22545169/name-jdbc-mydb-is-not-bound-in-this-context

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!