我有DataSource,它在context.xml中的Tomcat 6上配置为MyDataSource . 我正在通过以下方式获取它:
DataSource dataSource;
try {
dataSource = (DataSource) new InitialContext().lookup("java:comp/env/MyDataSource");
} catch (NamingException e) {
throw new DaoConfigurationException(
"DataSource '" + url + "' is missing in JNDI.", e);
}
一切正常 . 现在,我出口的代码到JBoss AP 6和我配置我的数据源,并根据同名其连接池当地-TX的数据源 .
当我执行上面的代码时,我收到了NamingException异常 . 经过一番调查后,我发现在Jboss下调用我的DataSource的正确方法是
dataSource = (DataSource) new InitialContext().lookup("java:/MyDataSource");
任何人都可以解释一下我为什么要在Jboss下的JNDI路径中省略“comp / env”?
2 回答
定义数据源的可移植方法是使用 resource reference . 资源的引用使您能够为您的数据源,相对于你的应用程序命名上下文(
java:comp/env
)定义的JNDI名称,然后映射该逻辑参考应用服务器定义的物理资源,其JNDI名称是专有的应用服务器供应商 . 这种方法使您的代码和程序集可以移植到任何兼容的应用程序服务器 .步骤1:声明和查找资源参考
选项1
这可以通过在Web部署描述符(
WEB-INF/web.xml
)中声明resource-ref
来完成:在代码中,您可以使用JNDI名称
java:comp/env/jdbc/MyDataSource
查找此资源:无论部署应用程序的服务器如何,此JNDI名称都不会更改 .
选项2
或者,从Java EE 5(Servlet 2.5)开始,使用@Resource注释可以在代码中更轻松地完成此操作 . 这消除了在Web部署描述符(web.xml)中配置resource-ref的需要,并且无需执行显式JNDI查找:
此方法与前一个选项具有相同的结果,但会减少程序集中的样板代码和配置 .
步骤2:将资源引用映射到数据源
然后,你将需要使用你的应用程序服务器专有的方式映射资源引用到您在服务器上创建的物理数据源,例如,使用JBoss的自定义部署描述符(
WEB-INF/jboss-web.xml
):或者,例如,使用Tomcat的
context.xml
:您可以在数据源定义中添加'jndi-name'标记:
你可以在JBoss wiki上找到数据源文档:ConfigDataSources