当前页面: 开发资料首页 → J2EE 专题 → JNDI的问题
JNDI的问题
摘要: JNDI的问题
在tomcat中,我在程序中用
DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/postgres" );
在OC4J中,程序用
DataSource ds = (DataSource) cxt.lookup( "jdbc/postgres" );
为什么tomcat要用java:/comp/env这个东东,而OC4J用了这个东东还不行.搞得程序在不用的APPSVR中还要修改才能用.
其实这两种写法在j2ee规范中都是可以的.
好一点的j2ee服务器是能自动识别.
其实这个识别程序做起来也不会很麻烦的,2~3行代码就可以搞定了.
那还有那些appserv用
DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/postgres" );
这种模式的呢?
java:/comp/env一般是在本地使用,访问本地资源(在同一个服务器中的),而不加这个是外部
java:/comp/env这个叫单点入口地址。
每一个容器提供厂家都有一个特定的单点入口地址。
当你在容器外用JNDI拿容器里的东西时 比如tomcat。你当然要提供单点入口地址
否则JVM怎么知道你调用的到底只哪个容器里的东西?
而在容器内就不必提供单点入口地址了。因为默认的会调用自己容器中的东西。
auth="Container"
type="javax.sql.DataSource"/>
factory
org.apache.commons.dbcp.BasicDataSourceFactory
maxActive
100
maxIdle
30
maxWait
10000
username
accounting
password
61882636
driverClassName
org.postgresql.Driver
url
jdbc:postgresql://localhost:5000
---------------------------------------------
我在accounting 这个应用中使用jdbc/postgres不用使用
DataSource ds = (DataSource) cxt.lookup( "jdbc/postgres" );
这个吗,一个Context是不是一个容器
我在tomcat中server.xml配置了,在jbuilder中编辑工程时报Name jdbc is not bound in this Context。jbuilder编译后调的是工程下的server8083.xml,里面没有jndi配置,jbuilder里那里设置jndi?。
to chnic(挠痒痒) :
我觉得好象不是这样的吧!我记得好象是如果java:/comp/env开头,就是从自己里面取,如果不是就是从远程的。至于你说的“否则JVM怎么知道你调用的到底只哪个容器里的东西”,这个是根据JNDI的配置,其中INITIAL_CONTEXT_FACTORY可以设定jndi用哪一个什么规范实现,相当于访问谁的服务器,如tomcat还是jboss,而服务器的地址通过PROVIDER_URL设定
to shangqiao(伤桥(千万不要理解为我可怜桥,是“伤心桥下”的缩写)
假如你在tomcat中绑定了一个bean,如果你要在容器外用就是像你说的一样,必须要用hashtable,里面放java:/comp/env这样的JNDI地址,还要提供一个工厂。如果是在容器里面比如说是在JSP里面调用这个bean就直接用lookup()方法就好了。其实JNDI就是一个层次型的数据库。没有上层是得不到下层的。就像遍历XML一样。你要遍历子节点必须要先遍历父节点的道理一样。
我就是想有一种通用的解决方法,除了改程序以外.
问一个,在websphere中是那种方法?
websphere 用
DataSource ds = (DataSource) cxt.lookup( "jdbc/postgres" );
websphere V6:
既可jdbc/postgres 也可 java:comp/....
在V6中推荐后一种