我在两个 Postgresql DB 上的 Web 应用程序(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 更多
这是我配置两个数据源的方式
在
WEB-INF/web.xml
我已经用 resource-ref 声明了这两个资源:<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
我有<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>
我究竟做错了什么?