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中还要修改才能用.
问题点数:20、回复次数:12Top
1 楼Javafan0(狂刀)回复于 2006-07-04 10:57:12 得分 0
其实这两种写法在j2ee规范中都是可以的.
好一点的j2ee服务器是能自动识别.
其实这个识别程序做起来也不会很麻烦的,2~3行代码就可以搞定了.Top
2 楼xywl(xywl)回复于 2006-07-04 11:09:20 得分 0
那还有那些appserv用
DataSource ds = (DataSource) cxt.lookup( "java:/comp/env/jdbc/postgres" );
这种模式的呢?Top
3 楼shangqiao(伤桥(千万不要理解为我可怜桥,是“伤心桥下”的缩写))回复于 2006-07-04 11:23:38 得分 0
java:/comp/env一般是在本地使用,访问本地资源(在同一个服务器中的),而不加这个是外部Top
4 楼chnic(挠痒痒)回复于 2006-07-04 11:43:47 得分 20
java:/comp/env这个叫单点入口地址。
每一个容器提供厂家都有一个特定的单点入口地址。
当你在容器外用JNDI拿容器里的东西时 比如tomcat。你当然要提供单点入口地址
否则JVM怎么知道你调用的到底只哪个容器里的东西?
而在容器内就不必提供单点入口地址了。因为默认的会调用自己容器中的东西。Top
5 楼xywl(xywl)回复于 2006-07-04 12:57:12 得分 0
<Context docBase="accounting" path="/accounting" reloadable="true" source="org.eclipse.jst.j2ee.server:accounting">
<Resource name="jdbc/postgres"
auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/postgres">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<parameter>
<name>username</name>
<value>accounting</value>
</parameter>
<parameter>
<name>password</name>
<value>61882636</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>org.postgresql.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:postgresql://localhost:5000</value>
</parameter>
</ResourceParams>
</Context>
---------------------------------------------
我在accounting 这个应用中使用jdbc/postgres不用使用
DataSource ds = (DataSource) cxt.lookup( "jdbc/postgres" );
这个吗,一个Context是不是一个容器Top
6 楼cxq82ok(我の心太乱)回复于 2006-07-04 13:49:32 得分 0
我在tomcat中server.xml配置了,在jbuilder中编辑工程时报Name jdbc is not bound in this Context。jbuilder编译后调的是工程下的server8083.xml,里面没有jndi配置,jbuilder里那里设置jndi?。Top
7 楼shangqiao(伤桥(千万不要理解为我可怜桥,是“伤心桥下”的缩写))回复于 2006-07-04 16:20:31 得分 0
to chnic(挠痒痒) :
我觉得好象不是这样的吧!我记得好象是如果java:/comp/env开头,就是从自己里面取,如果不是就是从远程的。至于你说的“否则JVM怎么知道你调用的到底只哪个容器里的东西”,这个是根据JNDI的配置,其中INITIAL_CONTEXT_FACTORY可以设定jndi用哪一个什么规范实现,相当于访问谁的服务器,如tomcat还是jboss,而服务器的地址通过PROVIDER_URL设定Top
8 楼chnic(挠痒痒)回复于 2006-07-04 16:51:54 得分 0
to shangqiao(伤桥(千万不要理解为我可怜桥,是“伤心桥下”的缩写)
假如你在tomcat中绑定了一个bean,如果你要在容器外用就是像你说的一样,必须要用hashtable,里面放java:/comp/env这样的JNDI地址,还要提供一个工厂。如果是在容器里面比如说是在JSP里面调用这个bean就直接用lookup()方法就好了。其实JNDI就是一个层次型的数据库。没有上层是得不到下层的。就像遍历XML一样。你要遍历子节点必须要先遍历父节点的道理一样。Top
9 楼xywl(xywl)回复于 2006-07-05 02:29:26 得分 0
我就是想有一种通用的解决方法,除了改程序以外.Top
10 楼xywl(xywl)回复于 2006-07-05 12:43:04 得分 0
问一个,在websphere中是那种方法?Top
11 楼Javafan0(狂刀)回复于 2006-07-05 12:55:35 得分 0
websphere 用
DataSource ds = (DataSource) cxt.lookup( "jdbc/postgres" );
Top
12 楼kaolaxiong(考拉熊)回复于 2006-07-05 14:02:50 得分 0
websphere V6:
既可jdbc/postgres 也可 java:comp/....
在V6中推荐后一种
Top




