使用Atomikos UserTransaction的Jetty数据源

时间:2010-02-28 16:12:36

标签: postgresql java-ee jetty jta atomikos

我的两个Postgresql数据库中的Web应用程序(principalDB和backupDB)中有两个数据源,还有一个Web容器管理的事务管理器(带Atomikos)。 Spring FW和Hibernate是我应用程序的构建块。我遇到的问题是Jetty 6.1.3 Web容器似乎没有加载声明资源的应用程序特定的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

以下是我配置两个数据源的方法

    {li>

    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>
    
    我有WEB-INF/jetty-env.xml

    中的
  1.                                      

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

  2. 我做错了什么?

1 个答案:

答案 0 :(得分:2)

确定您遵循http://docs.codehaus.org/display/JETTY/Atomikos第1步第2步(假设您使用的是Atomikos 3.3及更高版本)。

然后,对于第3步,请特别注意本说明:

  

由于NonXADataSourceBean仅使用 java.sql.Driver的类名和网址,因此您可以将其用于提供JDBC驱动程序的任何数据库。

因此,您当前的设置包含太多内容,但更重要的是,驱动程序类名称看起来不对,应该是org.postgresql.Driver

但是PostgreSQL JDBC驱动程序确实支持XADatasourceorg.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>