javax.naming.InitialContext.lookup("java:comp/env/***")

本文详细解释了J2EE中通过环境命名上下文(ENC)获取数据源的方法,对比了ENC与JNDI的区别,并介绍了如何通过配置文件实现不同环境下数据源的灵活映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于获取数据源的语法,大体有(javax.sql.DataSource) ctx.lookup ("java:comp/env/XXX")和(javax.sql.DataSource) ctx.lookup("XXX")两种写法,好多人以为这两种写法是相同的,以为都是通过JNDI来获取数据源。其实java:comp/env和 JNDI是不同的,java:comp/env 是环境命名上下文(environment naming context(ENC)),是在EJB规范1.1以后引入的,引入这个是为了解决原来JNDI查找所引起的冲突问题,也是为了提高EJB或者J2EE应用的移植性。ENC是一个引用,引用是用于定位企业应用程序的外部资源的逻辑名。引用是在应用程序部署描述符文件中定义的。在部署时,引用被绑定到目标可操作环境中资源的物理位置(JNDI名)。使用ENC是把对其它资源的JNDI查找的硬编码解脱出来,通过配置这个引用可以在不修改代码的情况下,将引用指向不同的EJB(JNDI)。 在J2EE中的引用常用的有: 
1.JDBC 数据源引用在java:comp/env/jdbc 子上下文中声明 
2.JMS 连接工厂在java:comp/env/jms 子上下文中声明 
3.JavaMail 连接工厂在java:comp/env/mail 子上下文中声明 
4.URL 连接工厂在 java:comp/env/url子上下文中声明 

假如你写了一个EJB,获取datasource如:dataSource = (DataSource) ctx.lookup("java:comp/env/jdbc/DBPool"); 
那么在配置文件中进行资源映射时,在ejb-jar.xml中, 
     <resource-ref> 
       <res-ref-name>jdbc/DBPool</res-ref-name> 
       <res-type>javax.sql.DataSource</res-type> 
       <res-auth>Container</res-auth> 
     </resource-ref> 
在weblogic-ejb-jar.xml中, 
   <reference-descriptor> 
     <resource-description> 
       <res-ref-name>jdbc/DBPool</res-ref-name> 
       <jndi-name>OraDataSource</jndi-name> 
     </resource-description> 
   </reference-descriptor> 
//转者注:如果是在jboss则在jboss.xml中做如下修改 
   <resource-managers> 
       <resource-manager> 
           <res-name>jdbc/DBPool</res-name> 
           <res-jndi-name>OraDataSource</res-jndi-name> 
       </resource-manager> 
   </resource-managers> 
实际服务器中的JNDI名字是OraDataSource,逻辑名jdbc/DBPool只是用来和它作映射的,这样做的好处是为了提高可移植性,移植的时候只需要把配置文件改一下就可以,而应用程序可不用改动。
我的代码jar包可以正常运行,改成war包后就报错21-Mar-2025 09:12:03.251 严重 [localhost-startStop-1] org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常[logicAuthFilter] javax.naming.NamingException: 无法创建资源实例 at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:98) at java.naming/javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:342) at org.apache.naming.NamingContext.lookup(NamingContext.java:846) at org.apache.naming.NamingContext.lookup(NamingContext.java:157) at org.apache.naming.NamingContext.lookup(NamingContext.java:834) at org.apache.naming.NamingContext.lookup(NamingContext.java:171) at org.apache.catalina.core.DefaultInstanceManager.lookupFieldResource(DefaultInstanceManager.java:527) at org.apache.catalina.core.DefaultInstanceManager.processAnnotations(DefaultInstanceManager.java:437) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:164) at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:143) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:252) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:100) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4290) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4925) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:710) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:687) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:660) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1018) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1912) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent
最新发布
03-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值