【问题标题】:Getting JNDI to work with RDS让 JNDI 与 RDS 一起工作
【发布时间】:2011-09-29 07:44:52
【问题描述】:

我正在尝试将 Tomcat 7 配置为使用 RDS/MySQL 实例,但我没有运气。我怀疑问题出在我的 context.xml 中。如果存在 context.xml,就会发生一些不好的事情,例如无法通过 Eclipse 进行远程调试,因此无法调试我的数据库代码正在发生的事情。我的 context.xml(删除了用户名/密码等详细信息以保护无辜者):

<?xml version='1.0' encoding='utf-8'?>
<Context path="/puppy" reloadable="true" crossContext="true">
    <Resource name="jdbc/myDB" 
      auth="Container"
      type="javax.sql.DataSource" 
      username="username" 
      password="password"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://rds-instance:3306/myDB?autoReconnect=true"
      validationQuery="select 1"
      maxActive="10" 
      maxIdle="4"/>
</Context>

部署应用后,我的日志中会显示以下内容:

WARNING: Failed to retrieve JNDI naming context for container [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/puppy]] so no cleanup was performed for that container
javax.naming.NameNotFoundException: Name comp is not bound in this Context
    at org.apache.naming.NamingContext.lookup(NamingContext.java:803)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:159)
    at org.apache.catalina.deploy.NamingResources.cleanUp(NamingResources.java:975)
    at org.apache.catalina.deploy.NamingResources.stopInternal(NamingResources.java:957)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5504)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:225)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3847)
    at org.apache.catalina.manager.ManagerServlet.reload(ManagerServlet.java:949)
    at org.apache.catalina.manager.HTMLManagerServlet.reload(HTMLManagerServlet.java:676)
    at org.apache.catalina.manager.HTMLManagerServlet.doPost(HTMLManagerServlet.java:214)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.filters.CsrfPreventionFilter.doFilter(CsrfPreventionFilter.java:187)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:572)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:301)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:162)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:636)
Jul 6, 2011 4:44:52 AM org.apache.catalina.core.NamingContextListener lifecycleEvent
SEVERE: Creation of the naming context failed: javax.naming.NamingException: Context is read only

知道发生了什么吗?人们不将 JNDI 与 RDS 一起使用吗?最好的方法是什么?

【问题讨论】:

    标签: mysql jndi amazon-rds


    【解决方案1】:

    这可能是因为以前的应用程序没有从 tomcat 容器中正确卸载。

    停止tomcat,然后进入tomcat conf目录/&lt;Tomcat root&gt;/conf/Catalina/localhost,清理该目录下的xml文件。并重启tomcat

    注意:1. 删除前先备份这些xml文件,如果不行可以恢复。

    【讨论】:

      【解决方案2】:

      我在本地尝试在 tomcat8 上部署带有 jndi 引用的 webapp 时遇到了类似的问题。似乎较新版本的 tomcat 需要在服务器 context.xml 配置中链接资源。 就我而言,我解决了它,将以下行添加到服务器 context.xml:

      <ResourceLink name="JDBC_DATASOURCE_NAME_DEF_IN_SERVER:XML" global="JDBC_DATASOURCE_NAME_DEF_IN_SERVER:XML" type="javax.sql.DataSource"/>
      

      JDBC_DATASOURCE_NAME_DEF_IN_SERVER:XML 表示在你的 tomcat 实例的 server.xml 配置文件中使用用于定义资源的名称。

      名称属性 - 用于将资源公开给已部署的应用程序上下文的名称。

      全局属性--tomcat的server.xml配置文件中定义的jndi资源的名称。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2016-12-13
        • 2016-10-06
        • 2011-11-30
        • 2014-02-19
        • 2011-09-03
        • 2013-05-01
        • 2018-05-30
        • 2014-03-17
        • 2013-09-05
        相关资源
        最近更新 更多