javax.naming.NameNotFoundException: имя [jdbc / rhwebDB] не связано в этом контексте.Невозможно найти [jdbc] - PullRequest
0 голосов
/ 23 мая 2018

Я знаю, что есть много вопросов относительно этого исключения, однако, я считаю, что я пробовал все в течение многих дней, но пока безуспешно.Поскольку это рабочий сервер, я могу работать с ним только после полуночи: (

У меня есть приложение Tomcat. Недавно я обновил пул соединений, чтобы использовать пул jdbc-соединений Tomcat.моя машина для разработки Windows, все работает нормально, но теперь, когда я пытаюсь реализовать это на моем Linux-сервере, я получаю это исключение (см. заголовок), когда мое приложение пытается подключиться к MySQL.

I 'Я использую «Easy Tomcat 7», который должен быть таким же, как и обычная версия Tomcat, только он поставляется с программным обеспечением CPanel.

Мне просто нужна эта БД для этого приложения (не для нескольких приложений).

Это мой класс 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();
}

Это мой файл context.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 имеет эти настройкидля этого сайта. У меня естьтакже попытался добавить параметр 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, определяющий хост для этого сайта:

<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 (/ Главная / rhmexweb / public_html / WEB-INF ).Я упоминал об этом, потому что я добавил параметр copyXML = "true" просто чтобы посмотреть, куда tomcat попытается скопировать файл context.xml, и если он изменит свое имя, но окажется, что есть два разных пути,Сначала я получил исключение для прав записи, когда впервые включил этот параметр, и он пытался создать папку здесь:

/ var / lib / easy-tomcat7 / webapps /

Этот путь,содержит только папки приложения tomcat по умолчанию (manager, examples & host-manager)

Эта папка, в которой перечислены все веб-сайты и все скомпилированные файлы jsp:

/ usr/ local / easy / etc / easy-tomcat7 / Catalina /

однако в /usr/local/easy/etc/easy-tomcat7/Catalina/rhweb.mx/ нет каталога WEB-INF.

В любом случае, я хотел бы знать, может ли наличие элемента Context в определении хоста быть проблемой для Tomcat, чтобы найти файл appPath / META-INF / context.xml.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Я наконец-то решил это !!

Возможно, это обходной путь, но он работает.

Я скопировал файл app-directory / META-INF / context.xmlв:

$ CATALINA_BASE / conf / [имя_собора] / [имя_хоста] / context.xml.default (обратите внимание на часть имени файла по умолчанию)

Как указано в документации Tomcat

Теперь мне не нужно добавлять ни записи в файл web.xml моего приложения, ни в META-INF / context.XML-файл в каталоге моего приложения (который не расположен в каталоге Tomcat's / webapps)

Все, что мне нужно, это поместить файл context.xml.default (содержащий информацию о его БД) вкаждая папка, указанная в этом пути:

$ CATALINA_BASE / conf / [enginename] /

, которая на моем сервере:

/ usr / local / easy / etc / easy-tomcat7 / Catalina /

поэтому для этого сайта я скопировал его в:

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

Вы заметите, что мой путь другойот той, которая указана в документации Tomcat, и это потому, что я использую easy-tomcat 7 CPanel, который имеет структуру, отличную от обычной Tomcat.Этот факт все усложнил при поиске решения, даже если оно называется easy -tomcat.

О том, почему Tomcat никогда не может прочитать /META-INF/context.xml, который остаетсятайна, но, честно говоря, мне все равно, так как этот метод проще (один файл вместо двух)

0 голосов
/ 04 июня 2018

Похоже, что-то не так с настройкой context.xml.Попробуйте server.xml или /META-INF/context.xml, чтобы увидеть, не ведет ли он себя по-другому.

Вы можете попробовать переместить конфигурацию в server.xml согласно Документам Tomcat 7 :

<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>

Если это выиграло 'В работе вы можете проверить несколько других подходов , обсуждаемых в этом ответе .

...