web-dev-qa-db-ja.com

javax.naming.NameNotFoundException:名前[jdbc / rhwebDB]はこのコンテキストにバインドされていません。 [jdbc]が見つかりません

私はこの例外に関して多くの質問があることを知っていますが、私は何日もすべてを試しましたが、まだ運がありません。これは実稼働サーバーであるため、真夜中以降にしか作業できません:(

Tomcatアプリがあります。最近、Tomcatのjdbc接続プールを使用するために、接続プールを更新しました。 Windows開発マシンでは、すべてが正常に機能しますが、Linuxサーバーにこれを実装しようとしているため、アプリがMySQLに接続しようとするたびにこの例外(タイトルを参照)が表示されます。

Tomcatの通常バージョンと同じであるはずの「Easy Tomcat 7」を使用していますが、CPanelソフトウェアにのみ付属しています。

このDBをこのアプリで使用できるようにするだけです(複数のアプリではありません)。

これは私のJava DBクラス:

public class DBUtil {

static DataSource ds;
static {
    try {
        Context context = new InitialContext();
        ds = (DataSource)context.lookup("Java:comp/env/jdbc/rhwebDB");
    } catch (NamingException e) {
        e.printStackTrace();
        System.out.println("DBUtil.NamingException" + e);
    } catch(Exception e) {
        System.out.println(e);
    }
}

public static Connection getConnection() throws SQLException {
    return ds.getConnection();
}

これはmyContext.xmlファイルで、myAppDirectory/META-INFにあります

<?xml version="1.0" encoding="UTF-8"?>

<Context>
<Resource
    name="jdbc/rhwebDB"
    auth="Container"
    type="javax.sql.DataSource"
    factory="org.Apache.Tomcat.jdbc.pool.DataSourceFactory"
    testWhileIdle="true"
    testOnBorrow="true"
    testOnReturn="false"
    validationQuery="SELECT 1"
    validationInterval="30000"
    timeBetweenEvictionRunsMillis="30000"
    maxActive="20"
    minIdle="3"
    maxIdle="15"
    maxWait="10000"
    initialSize="3"
    removeAbandonedTimeout="60"
    removeAbandoned="true"
    logAbandoned="true"
    minEvictableIdleTimeMillis="30000"
    username="dbuser"
    password="dbpwd"
    driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://127.0.0.1:3306/rhmexweb_rhweb"/>
</Context>

WARファイルは使用しません。ファイルをサーバーにアップロードし、必要に応じてTomcatを再起動するだけで、通常は正常に機能します。

これも関連する場合、Tomcatのserver.xmlファイルには、このWebサイト用のこの設定があります。私はこれまでのところ運が悪かったので、パラメータcopyXML = "true"を追加しようとしました。

       <Host name="rhweb.net" appBase="webapps">
       <Alias>www.rhweb.net</Alias>
       <Context path="" reloadable="false" docBase="/home/rhweb/public_html" debug="1"/>
       </Host>

私のアプリがMySQLとの接続を確立しようとしたときに取得する完全なスタックトレースは次のとおりです。

javax.naming.NameNotFoundException: Name [jdbc/rhwebDB] is not bound in this Context. Unable to find [jdbc].
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:820)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:154)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:831)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:154)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:831)
    at org.Apache.naming.NamingContext.lookup(NamingContext.Java:168)
    at org.Apache.naming.SelectorContext.lookup(SelectorContext.Java:158)
    at javax.naming.InitialContext.lookup(InitialContext.Java:415)
    at util.DBUtil.<clinit>(DBUtil.Java:23)
    at Solutio.AdminRH.Entity.ISeguridadAdminDB.verificaUsuario(ISeguridadAdminDB.Java:142)
    at org.Apache.jsp.menu_jsp._jspService(menu_jsp.Java:115)
    at org.Apache.jasper.runtime.HttpJspBase.service(HttpJspBase.Java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
    at org.Apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.Java:432)
    at org.Apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.Java:390)
    at org.Apache.jasper.servlet.JspServlet.service(JspServlet.Java:334)
    at javax.servlet.http.HttpServlet.service(HttpServlet.Java:728)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:305)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:210)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:222)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:123)
    at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:502)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:171)
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:99)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:118)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:408)
    at org.Apache.coyote.ajp.AjpProcessor.process(AjpProcessor.Java:200)
    at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:589)
    at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:310)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
    at Java.lang.Thread.run(Thread.Java:745)

また、アプリのweb.xmlファイルにこれらの行を追加しようとしました(Windowsマシンに含める必要はありませんでした)

   <resource-ref>
       <description>MySQL RhWeb Datasource</description>
       <res-ref-name>jdbc/rhwebDB</res-ref-name>
       <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
   </resource-ref>

そして、これらの行を含めると、私が受け取る例外はこれです:

org.Apache.Tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'

TomcatはMETA-INF/context.xmlファイルを見つけることができないか、このリンクを認識しないようです。

ds =(DataSource)context.lookup( "Java:comp/env/jdbc/rhwebDB");

私のLinux、Tomcat、およびJDKバージョンは次のとおりです。

CentOSリリース6.8(最終)
Apache Tomcat/7.0.42
Javaバージョン「1.7.0_131」

これを修正するために他に何ができるかわかりません。どんな助けも本当に感謝されます

更新

私はまだ解決策を見つけていません。これに関連する可能性のあるいくつかの構成上の問題に気付きました。

アプリは次の場所にあります。

/ home/rhmexweb/public_html

ただし、Tomcatのserver.xmlファイルでは、このWebサイトのホスト定義は次のとおりです。

<Host name="rhweb.mx" appBase="webapps">
<Context path="" reloadable="false" docBase="/home/rhmexweb/public_html" />
</Host>

Webappsディレクトリにない理由は、CPanelがすべてのアカウントを/ home/account-name/public_htmlに自動的に作成するためです。そのため、ここでコンテキスト要素が必要です(推測)。 Contextタグ全体を削除し、代わりにappBase = "/ home/rhmexweb/public_html"を使用すると、TomcatはWEB-INFフォルダーからすべてのjarとコンテンツを見つけられません(- / home/rhmexweb/public_html/WEB-INF)。これは、Tomcatがcontext.xmlファイルをコピーしようとする場所を確認するためだけにパラメーターcopyXML = "true"を追加し、名前が変更された場合に2つの異なるパス。最初にそのパラメーターを含めると書き込み許可の例外が発生し、ここでフォルダーを作成しようとしていました。

/ var/lib/easy-Tomcat7/webapps /

このパスには、デフォルトのTomcatアプリ(マネージャー、例、ホストマネージャー)のフォルダーのみが含まれます

すべてのWebサイトがリストされ、コンパイルされたすべてのjspファイルがあるフォルダーは次のとおりです。

/ usr/local/easy/etc/easy-Tomcat7/Catalina /

ただし、/ usr/local/easy/etc/easy-Tomcat7/Catalina/rhweb.mx /にはWEB-INFディレクトリはありません。

とにかく、私が知りたいのは、appPath/META-INF/context.xmlファイルを見つけるために、ホスト定義にContext要素を持つことがTomcatにとって問題になる可能性があるかどうかです。

10
Sergio

ようやく解決しました!!

回避策かもしれませんが、動作します。

App-directory/META-INF/context.xmlファイルを次の場所にコピーしました。

$ CATALINA_BASE/conf/[enginename]/[hostname] /context.xml.default(「デフォルト」部分に注意ファイル名の)

Tomcatのドキュメント で述べられているように

これで、アプリのweb.xmlファイルにエントリを追加する必要がなくなり、アプリディレクトリのMETA-INF/context.xmlファイルも(notTomcatの/ webappsディレクトリにあります)

必要なのは、このパスにリストされているすべてのフォルダーにcontext.xml.defaultファイル(DB情報を含む)を配置することです。

$ CATALINA_BASE/conf/[エンジン名] /

私のサーバーでは:

/ usr/local/easy/etc/easy-Tomcat7/Catalina /

このウェブサイトでは、次の場所にコピーしました。

/usr/local/easy/etc/easy-Tomcat7/Catalina/myDomain.com/

私のパスはTomcatのドキュメントで指定されているものとは異なることに気付くでしょう。それは、通常のTomcatとは異なる構造を持つCPanelのeasy-Tomcat 7を使用しているからです。その事実は、easy-Tomcatと呼ばれる場合でも、ソリューションを探すときにすべてをより複雑にしました。

Tomcatが/META-INF/context.xmlを読み取れなかった理由については謎のままですが、正直なところ、この方法は簡単なので(2つではなく1つのファイル)あまり気にしません

0
Sergio

context.xmlセットアップに何か問題があるようです。 server.xmlまたは/META-INF/context.xmlを試して、動作が異なるかどうかを確認してください。

Tomcat 7 docs に従って、構成をserver.xmlに移動してみることができます。

<GlobalNamingResources>
  <Resource
    name="jdbc/rhweb_rhwebDB"
    auth="Container"
    type="javax.sql.DataSource"
    ...
  />
</GlobalNamingResources>

context.xmlのグローバルリソースへのリンク:

<Context>
  <ResourceLink
    global="jdbc/rhweb_rhwebDB"
    name="jdbc/rhwebDB"
    type="javax.sql.DataSource"
  />
</Context>

そして、あなたが既にしているように/WEB-INF/web.xmlでそれを参照します:

<resource-ref>
  <res-ref-name>jdbc/rhwebDB</res-ref-name>
  <res-ref-type>javax.sql.DataSource</res-ref-type>
  <res-auth>Container</res-auth>
</resource-ref>

これがうまくいかない場合は、他のいくつかのアプローチを確認できます この回答で説明

2
Karol Dowbecki