gpt4 book ai didi

java - 从独立应用程序访问数据源

转载 作者:行者123 更新时间:2023-11-30 04:17:07 25 4
gpt4 key购买 nike

我已经在Websphere服务器中创建了数据源,其名称为myDataSource(JNDI名称为oracleDS)。现在我想通过独立应用程序访问它。

我刚刚编写了以下代码来访问数据源。

Hashtable<String, String> pdEnv = new Hashtable<String, String>();
pdEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
pdEnv.put(Context.PROVIDER_URL, "iiop://localhost:2809");

Context initialContext = new InitialContext(pdEnv);

DataSource dataSource = (DataSource) initialContext
.lookup("java:comp/env/jdbc/oracleDS");

但是当我运行该应用程序时,我收到以下异常。

Aug 6, 2013 11:33:41 PM null null
SEVERE: javaAccessorNotSet
javax.naming.ConfigurationException: Name space accessor for the java: name space has not been set. Possible cause is that the user is specifying a java: URL name in a JNDI Context method call but is not running in a J2EE client or server environment.

请告诉我是否需要在 websphere 中进行任何配置更改才能访问数据源或是否需要进行任何其他代码级别更改?

请确认我们可以从容器(websphere)外部访问数据源吗?

更新1:

我按照PhilipJ提到的方式进行操作。然后我得到了以下异常。

SEVERE: Cannot get connection: javax.naming.NameNotFoundException: Context: LTC-VIRTUS-24WZNode01Cell/nodes/LTC-VIRTUS-24WZNode01/servers/server1, name: jdbc/oracleDS: First component in name oracleDS not found. [Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]
javax.naming.NameNotFoundException: Context: LTC-VIRTUS-24WZNode01Cell/nodes/LTC-VIRTUS-24WZNode01/servers/server1, name: jdbc/oracleDS: First component in name oracleDS not found. [Root exception is org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0]
at com.ibm.ws.naming.jndicos.CNContextImpl.mapNotFoundException(CNContextImpl.java:4365)
at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1794)
at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1749)
at com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt(CNContextImpl.java:1500)
at com.ibm.ws.naming.jndicos.CNContextImpl.lookup(CNContextImpl.java:637)
at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:165)
at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:179)
at javax.naming.InitialContext.lookup(InitialContext.java:436)
at com.nyl.connection.ConnectionUtil.getConnection(ConnectionUtil.java:38)
at com.nyl.main.Main.main(Main.java:9)
Caused by: org.omg.CosNaming.NamingContextPackage.NotFound: IDL:omg.org/CosNaming/NamingContext/NotFound:1.0
at org.omg.CosNaming.NamingContextPackage.NotFoundHelper.read(NotFoundHelper.java:95)
at com.ibm.WsnOptimizedNaming._NamingContextStub.resolve_complete_info(_NamingContextStub.java:506)
at com.ibm.ws.naming.jndicos.CNContextImpl$2.run(CNContextImpl.java:2797)
at com.ibm.ws.naming.jndicos.CNContextImpl$2.run(CNContextImpl.java:2793)
at com.ibm.ws.naming.util.CommonHelpers.retry(CommonHelpers.java:763)
at com.ibm.ws.naming.jndicos.CNContextImpl.cosResolve(CNContextImpl.java:2791)
at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1790)
... 8 more

更新2:

我找到了避免异常的方法。代码应如下所示,

Hashtable<String, String> pdEnv = new Hashtable<String, String>();
pdEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
pdEnv.put(Context.PROVIDER_URL, "iiop://localhost:2809");

Context initialContext = new InitialContext();
DataSource datasource = (DataSource) initialContext.lookup("oracleDS");

if (datasource != null) {
connection = datasource.getConnection("admin","admin");
} else {
LOGGER.info("Failed to lookup datasource.");
}

但这里的问题是我提供数据库凭据来创建连接。我不想给。谁能告诉我如何在不提供数据库凭据的情况下创建连接?

最佳答案

我找到了这个问题的解决方案。当我们创建 InitialContext 时,我们必须正确设置两个环境变量,如下所示,

Hashtable<String, String> pdEnv = new Hashtable<String, String>();
pdEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
pdEnv.put(Context.PROVIDER_URL, "iiop://localhost:2810");

Context initialContext = new InitialContext(pdEnv);

注意:我们可以通过以下方式找到iiop协议(protocol)的监听端口,

登录 Webapher 管理控制台 => 服务器 => 服务器类型 => Webspher 应用程序服务器 => 单击我们使用的服务器名称 => 通信 => 端口。

然后您可以找到端口名称BOOTSTRAP_ADDRESS的端口。

使用数据源创建连接的工作代码

Hashtable<String, String> pdEnv = new Hashtable<String, String>();
pdEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
pdEnv.put(Context.PROVIDER_URL, "iiop://localhost:2810");

Context initialContext = new InitialContext(pdEnv);
DataSource datasource = (DataSource) initialContext.lookup("testDS");

if (datasource != null) {
connection = datasource.getConnection("admin","admin"); // DB credintials
} else {
LOGGER.info("Failed to lookup datasource.");
}

注意:我在websphere(版本7)中创建了数据源,JNDI名称是testDS我们必须在类路径中添加 com.ibm.ws.ejb.thinclient_7.0.0.jar jar。

感谢 Sean F 和 PhilipJ 对此问题的支持。

关于java - 从独立应用程序访问数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18094822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com