2014-10-06 5 views
3

Я использую Jetty 9.2 (встроенный) со стандартным API-интерфейсом соединителя MySQL, и я очень смущен тем, как это должно быть настроено. В настоящее время, у меня есть это в моем web.xml файл:JNDI-поиск не работает с Jetty для соединения JDBC-соединения с MySQL?

<webapp ... 

    <resource-ref> 
     <description>JDBC Data Source</description> 
     <res-ref-name>jdbc/DataSource</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
    </resource-ref> 
</webapp> 

... и это в моем молы-env.xml:

<Configure class="org.eclipse.jetty.webapp.WebAppContext"> 

    <New id="DatabaseConnector" class="org.eclipse.jetty.plus.jndi.Resource"> 
     <Arg></Arg> 
     <Arg>jdbc/DataSource</Arg> 
     <Arg> 
      <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"> 
       <Set name="Url">jdbc:mysql://localhost:3306/DBName</Set> 
       <Set name="User">user</Set> 
       <Set name="Password">pass</Set> 
      </New> 
     </Arg> 
    </New> 

</Configure> 

... и этот код для инициализации:

Context envCtx = (Context) new InitialContext().lookup("java:comp/env"); 
DataSource datasource = (DataSource) envCtx.lookup("jdbc/DataSource"); 

Когда я пытаюсь запустить сервер, я получаю ошибку javax.naming.NameNotFoundException; remaining name 'jdbc/DataSource'. Я пробовал много разных вариантов строк в инициализации кода, например, удаление вызова lookup на объекте InitialContext, но я просто продолжаю получать вариации той же ошибки с другим значением name;

Оба файла xml находятся в моем каталоге /WAR/WEB-INF. Я просмотрел множество предыдущих вопросов и руководств, блогов и т. Д., Но я ничего не получаю.

+0

Можете ли вы разместить свой код 'WebAppContext.setConfiguration() для экземпляра Jetty Embedded? –

+0

У меня есть ответы, которые я искал где-то еще, я отправлю ответ, обобщающий решение. – RTF

ответ

1

Это была комбинация проблем, характерных для встроенных Jetty.

Во-первых, мой код запуска, который настраивал и запускал веб-сервер, выполнял поиск JNDI до того, как я начал веб-сервер, прежде чем позвонить server.start(), поэтому конфигурация JNDI не была инициализирована на этом этапе.

Но даже внесение этого изменения не сработало, потому что envCtx.lookup("jdbc/DataSource") необходимо вызывать из потока, связанного с WebApp. Поэтому я переместил этот код в статический блок, который вызывается при первом запросе соединения с базой данных с помощью запроса веб-сервера.

В конце концов, я закончил с чем-то вроде этого для моего кода пусковой:

public static void main(String[] args) { 
    Server server = new Server(); 

    //Enable parsing of jndi-related parts of web.xml and jetty-env.xml 
    ClassList classlist = ClassList.setServerDefault(server); 
    classlist.addAfter(
      "org.eclipse.jetty.webapp.FragmentConfiguration", 
      "org.eclipse.jetty.plus.webapp.EnvConfiguration", 
      "org.eclipse.jetty.plus.webapp.PlusConfiguration"); 
... 
... 
server.start(); 

Поиск JNDI не может быть сделан с помощью этого основного потока, так что положить его где-нибудь, как init метода сервлет-запрос или, как и я, синхронизированный метод класса статической базы данных базы данных, который используется сервлетами, например

public class DatabaseUtils { 

    private static DataSource datasource; 

    private static synchronized Connection getDBConnection() throws SQLException { 
     if (datasource == null) { 
      initDataSource(); 
     } 
     return datasource.getConnection(); 
    } 

    public static void initDataSource() { 
     try { 
      datasource = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/DataSource"); 
      LOG.info("Database connection pool initalized successfully"); 
     } catch (Exception e) { 
      LOG.error("Error while initialising the database connection pool", e); 
     } 
    } 
Смежные вопросы