Источник данных Jetty с Atomikos UserTransaction

У меня есть два источника данных в моем веб-приложении (principalDB и backupDB) на двух базах данных Postgresql, а также менеджер транзакций, управляемый веб-контейнером (с Atomikos) для них. Spring FW и Hibernate являются моими строительными блоками для приложения. Проблема, с которой я сталкиваюсь, заключается в том, что веб-контейнер Jetty 6.1.3, похоже, не загружает специфичный для приложения WEB-INF/jetty-env.xml, который объявляет ресурсы, поэтому я получаю исключение:

Caused by: javax.naming.NameNotFoundException; remaining name 'env/jdbc/principalDB'
 at org.mortbay.naming.NamingContext.lookup(NamingContext.java:634)
 at org.mortbay.naming.NamingContext.lookup(NamingContext.java:665)
 at org.mortbay.naming.NamingContext.lookup(NamingContext.java:680)
 at org.mortbay.naming.java.javaRootURLContext.lookup(javaRootURLContext.java:112)
 at javax.naming.InitialContext.lookup(InitialContext.java:351)
 at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:155)
 at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:88)
 at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:153)
 at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178)
 at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95)
 at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)
 at org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:200)
 at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:186)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368)
 at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334)
 ... 43 more

Вот как я настроил два источника данных

  1. в WEB-INF/web.xml я объявил два ресурса с ресурсной ссылкой как:

    <resource-ref>
     <description>The principal datasource</description>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
     <res-ref-name>jdbc/principalDB</res-ref-name>
    </resource-ref>
    <resource-ref>
     <description>The backup datasource</description>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
     <res-ref-name>jdbc/backupDB</res-ref-name>
    </resource-ref>
    
  2. в WEB-INF/jetty-env.xml у меня есть

    <New id="principalDB" class="org.mortbay.jetty.plus.naming.Resource">
    <Arg><Ref id="wac"/></Arg>
      <Arg>jdbc/principalDB</Arg>
      <Arg>
        <New class="com.atomikos.jdbc.nonxa.NonXADataSourceBean">
          <Set name="driverClassName">org.postgresql.jdbc3.Jdbc3ConnectionPool</Set>
          <Set name="ServerName">localhost</Set>
          <Set name="PortNumber">5432</Set>
          <Set name="DatabaseName">first</Set>
          <Set name="Url">jdbc:postgresql://localhost:5432/first</Set>
          <Set name="user">test</Set>
          <Set name="password">password</Set>
        </New>
      </Arg>
    </New>
    
    <New id="backupDB" class="org.mortbay.jetty.plus.naming.Resource">
    <Arg><Ref id="wac"/></Arg>
      <Arg>jdbc/backupDB</Arg>
      <Arg>
        <New class="com.atomikos.jdbc.nonxa.NonXADataSourceBean">
          <Set name="driverClassName">org.postgresql.jdbc3.Jdbc3ConnectionPool</Set>
          <Set name="ServerName">localhost</Set>
          <Set name="PortNumber">5432</Set>
          <Set name="DatabaseName">second</Set>
          <Set name="Url">jdbc:postgresql://localhost:5432/second</Set>
          <Set name="user">testSec</Set>
          <Set name="password">password</Set>
        </New>
      </Arg>
    </New>
    

What am I doing wrong?


person Petre Maierean    schedule 28.02.2010    source источник


Ответы (1)


Убедитесь, убедитесь, что вы выполнили Шаг 1 и Шаг 2 в http://docs.codehaus.org/display/JETTY/Atomikos (при условии, что вы используете Atomikos 3.3 и более поздние версии).

Затем на шаге 3 обратите особое внимание на это примечание:

поскольку NonXADataSourceBean использует только имя класса и URL-адрес java.sql.Driver, вы можете использовать его с любой базой данных, предоставляющей драйвер JDBC.

Таким образом, ваша текущая установка содержит слишком много вещей, но, что более важно, имя класса драйвера выглядит неправильно, оно должно быть org.postgresql.Driver.

Но драйвер JDBC PostgreSQL поддерживает XADatasource (с реализацией org.postgresql.xa.PGXADataSource), поэтому я бы предпочел настроить AtomikosDataSourceBean (первый вариант шага 3). Что-то такое:

<New id="mydatasource" class="org.mortbay.jetty.plus.naming.Resource">
  <Arg><Ref id='wac'/></Arg>
  <Arg>jdbc/mydatasource</Arg>
  <Arg>
    <New class="com.atomikos.jdbc.AtomikosDataSourceBean">
      <Set name="minPoolSize">2</Set>
      <Set name="maxPoolSize">20</Set>
      <Set name="xaDataSourceClassName">org.postgresql.xa.PGXADataSource</Set>
      <Set name="xaProperties">
        <New class="java.util.Properties">
          <Call name="setProperty"><Arg>databaseName</Arg><Arg>testdb</Arg></Call>
          <Call name="setProperty"><Arg>serverName</Arg><Arg>localhost</Arg></Call>
          <Call name="setProperty"><Arg>portNumber</Arg><Arg>5432</Arg></Call>
          <Call name="setProperty"><Arg>user</Arg><Arg>test</Arg></Call>
          <Call name="setProperty"><Arg>password</Arg><Arg>p4ssw0rd</Arg>/Call>
        </New>
      </Set>
      <Set name="UniqueResourceName">mydatasource</Set>
    </New>
  </Arg>
</New>
person Pascal Thivent    schedule 28.02.2010
comment
Кажется, что даже когда мой jetty-plus.xml представляет собой поврежденный XML (например, с незакрытым тегом «/Call›»), я получаю то же самое исключение, как если бы файл конфигурации полностью игнорируется Jetty. Я копирую конфигурацию из jetty-plus.xml в [jetty]/etc/jetty.xml и исправляю XML, поскольку источники данных все еще не зарегистрированы в JNDI. - person Petre Maierean; 28.02.2010
comment
@peter Трудно что-то сказать, не видя, что ты делаешь. Но эти инструкции docs.codehaus.org/display/JETTY/JNDI определенно работают. - person Pascal Thivent; 28.02.2010