3

私の Web アプリケーションには、2 つの Postgresql DB 上の 2 つのデータソース (principalDB と backupDB) があり、それらのための Web コンテナー管理のトランザクション マネージャー (Atomikos を使用) があります。Spring FW と Hibernate は、アプリケーションの構成要素です。私が直面している問題は、Jetty 6.1.3 Web コンテナーが、リソースを宣言するアプリ固有の WEB-INF/jetty-env.xml をロードしていないように見えるため、例外が発生することです。

原因: javax.naming.NameNotFoundException; 残りの名前「env/jdbc/principalDB」
 org.mortbay.naming.NamingContext.lookup (NamingContext.java:634) で
 org.mortbay.naming.NamingContext.lookup (NamingContext.java:665) で
 org.mortbay.naming.NamingContext.lookup (NamingContext.java:680) で
 org.mortbay.naming.java.javaRootURLContext.lookup (javaRootURLContext.java:112) で
 javax.naming.InitialContext.lookup(InitialContext.java:351) で
 org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:155) で
 org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:88) で
 org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:153) で
 org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178) で
 org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95) で
 org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105) で
 org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:200) で
 org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:186) で
 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1368) で
 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334) で
 ... 43 以上

2つのデータソースを構成する方法は次のとおりです

  1. で、WEB-INF/web.xmlresource-ref を使用して 2 つのリソースを次のように宣言しました。

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

私は何を間違っていますか?

4

1 に答える 1

2

http://docs.codehaus.org/display/JETTY/Atomikosのステップ1ステップ2に従っていることを確認してください(Atomikos 3.3以降を使用していると仮定します)。

次に、ステップ3では、次の点に特に注意してください。

はのクラス名とURLのみNonXADataSourceBean使用するため、JDBCドライバーを提供する任意のデータベースで使用できます。java.sql.Driver

したがって、現在の設定には多くのものが含まれていますが、さらに重要なのは、ドライバークラス名が間違っているように見えることorg.postgresql.Driverです。

ただし、PostgreSQL JDBCドライバーはXADatasource(実装で)サポートしているので、(ステップ3の最初のオプション)をorg.postgresql.xa.PGXADataSource構成したいと思います。そんな感じ:AtomikosDataSourceBean

<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>
于 2010-02-28T17:38:41.473 に答える