Ошибка конфигурации пула соединений mysql: javax.naming.NameNotFoundException; оставшееся имя 'env / jdbc / --- (mysql 5.0 + jetty 7.0.1) - PullRequest
5 голосов
/ 25 января 2010

Мои файлы конфигурации

Проект / WEB-INF / web.xml

<resource-ref>
    <description>ConnectionPool DataSource Reference</description>
    <res-ref-name>jdbc/mysql</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

Проект / WEB-INF / Причал-env.xml:

<New id="mysql" class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg></Arg>
<Arg>jdbc/mysql</Arg>
    <Arg>
        <New class="org.apache.commons.dbcp.BasicDataSource">
            <Set name="driverClassName">com.mysql.jdbc.Driver</Set>
            <Set name="url">jdbc:mysql://localhost:3306/db</Set>
            <Set name="username">user</Set>
            <Set name="password">pwd</Set>
            <Set name="maxActive">50</Set>
        </New>
    </Arg>
</New>

код для вызова:

ctx = new InitialContext();
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
con=ds.getConnection();

скрипты для запуска причала:

java -DOPTIONS=plus -jar start.jar

java -jar start.jar

В любом случае, чтобы начать причал, я получил следующую ошибку:


javax.naming.NameNotFoundException; remaining name 'env/jdbc/mysql'
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:632)
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:663)
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:678)
        at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:110)
        at javax.naming.InitialContext.lookup(Unknown Source)

Вопросы:

  • в чем здесь проблема?
  • Нужны ли другие конфигурации?
  • где поместить следующие файлы jar:
    • Обще-ДБХП-1.2.2.jar
    • MySQL-разъем-Java-5.1.10-bin.jar

Спасибо!

Ответы [ 4 ]

10 голосов
/ 17 февраля 2011

Примечание: ниже предполагается, что вы используете Jetty 7.2.2+ (возможно, работает с любым Jetty 7.0+).

Проблема в том, что вам не хватает ОДНОГО дополнительного слоя косвенности. Даже если вы настроили Jetty в своем веб-приложении, вам все же необходимо сообщить контейнеру Jetty, что ему нужно искать файл jetty-env.xml в вашем веб-приложении. Чтобы сделать это, добавьте следующее в ваш jetty.xml (в $ {JETTY_INSTALL_DIR} / etc:

<Call name="setAttribute">
  <Arg>org.eclipse.jetty.webapp.configuration</Arg>
  <Arg>
      <Array type="java.lang.String">
          <Item>org.eclipse.jetty.webapp.WebInfConfiguration</Item>
          <Item>org.eclipse.jetty.webapp.WebXmlConfiguration</Item>
          <Item>org.eclipse.jetty.webapp.MetaInfConfiguration</Item>
          <Item>org.eclipse.jetty.webapp.FragmentConfiguration</Item>
          <Item>org.eclipse.jetty.plus.webapp.EnvConfiguration</Item>
          <Item>org.eclipse.jetty.plus.webapp.PlusConfiguration</Item>
          <Item>org.eclipse.jetty.webapp.JettyWebXmlConfiguration</Item>
          <Item>org.eclipse.jetty.webapp.TagLibConfiguration</Item>
      </Array>
  </Arg>
</Call>

СЕЙЧАС Jetty будет знать, что нужно проанализировать созданный вами файл jetty-env.xml.

4 голосов
/ 25 февраля 2011

Это сводило меня с ума весь день. К вашему сведению, я работаю с Jetty 6.1.22. Комментарий к первому сообщению находится на пути - у меня было имя файла jetty-env.xml в WEB-INF, и оно игнорировалось. Я переименовал его в jetty-web.xml и указал полное имя источника данных (т.е. java: comp / env / jdbc / mydatasource) для второго аргумента директивы New, и это сработало.

0 голосов
/ 12 апреля 2012

В документации Jetty указан трехэтапный процесс для использования ресурса JNDI, такого как база данных. Эти инструкции должны применяться к Jetty 7 и Jetty 8.

  1. Отредактируйте файл $JETTY_HOME/start.ini следующим образом:
  2. Измените Сервер OPTIONS, добавив «плюс», например:

    OPTIONS=Server,jsp,jmx,resources,websocket,ext,plus

  3. В нижней части файла, в разделе «Файлы конфигурации», добавьте следующую строку после etc/jetty.xml:

    etc/jetty-plus.xml

0 голосов
/ 26 октября 2010

Столкнулся с такой же проблемой. Мой проект / WEB-INF / jetty-env.xml был:

<New id="DS" class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg><Ref id="studentsApp"/></Arg>
    <Arg>jdbc/DS</Arg>
    <Arg>
        <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
            <Set name="Url">jdbc:mysql://localhost:3306/students</Set>
            <Set name="User">root</Set>
            <Set name="Password">root</Set>
        </New>
    </Arg>
</New>

И произошла та же ошибка. Я пытался переключить jndi области - не работает. Событие, когда я пытался заглянуть в java: comp /, чтобы посмотреть, какие записи jndi доступны, ничего не возвращает. Код для использования в списке jndi:

Context t = (Context)new InitialContext().lookup("java:comp");
listContext(t, "");

private static final void listContext(Context ctx, String indent) {
    try {
        NamingEnumeration list = ctx.listBindings("");
        while (list.hasMore()) {
            Binding item = (Binding) list.next();
            String className = item.getClassName();
            String name = item.getName();
            System.out.println(indent + className + " " + name);
            Object o = item.getObject();
            if (o instanceof javax.naming.Context) {
                listContext((Context) o, indent + " ");
            }
        }
    } catch (NamingException ex) {
        System.out.println(ex);
    }
}

Я точно знал, что jetty-web.xml загружен - я добавил:

<Call class="org.eclipse.jetty.util.log.Log" name="info"><Arg>Starting my super test application</Arg></Call>

поверх jetty-web.xml и выводится при запуске сервера.

Затем я решил перейти с непереносимого файла jetty-web.xml на context.xml , поместив его в $ JETTY_HOME / contexts , поместил jar коннектора MySQL в $ JETTY_HOME / lib / ext , и он начал работать.

Похоже, у Jetty есть проблема с записями JNDI, если они загружены из jetty-web.xml .

...