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

Java 从独立应用程序访问数据源,java,jakarta-ee,websphere,datasource,Java,Jakarta Ee,Websphere,Datasource,我已经在WebSphereServer中创建了数据源,它的名称是myDataSource(JNDI名称是oracleDS)。现在我想通过独立应用程序访问它 我只是写了下面的代码来访问数据 Hashtable<String, String> pdEnv = new Hashtable<String, String>(); pdEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitia

我已经在WebSphereServer中创建了数据源,它的名称是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");
请让我知道我必须在websphere中进行任何配置更改才能访问数据源,或者我必须进行任何其他代码级别的更改吗

请确认我是否可以从容器(websphere)外部访问数据源

更新1:

我遵循菲利浦提到的方法。那我就把下面的例外情况列出来

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.
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.");
}
Hashtable pdEnv=new Hashtable();
pdEnv.put(Context.INITIAL\u Context\u工厂,“com.ibm.websphere.naming.WsnInitialContextFactory”);
pdEnv.put(Context.PROVIDER\u URL,“iiop://localhost:2809");
Context initialContext=新的initialContext();
DataSource DataSource=(DataSource)initialContext.lookup(“oracleDS”);
if(数据源!=null){
connection=datasource.getConnection(“admin”、“admin”);
}否则{
LOGGER.info(“未能查找数据源”);
}
但这里的问题是,我给数据库提供了创建连接的凭据。我不想给你。谁能告诉我如何在不提供数据库凭据的情况下创建连接

DataSource dataSource = (DataSource) initialContext
                    .lookup("jdbc/oracleDS");
这样试试。

我找到了这个问题的解决方案。 当我们创建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);
Hashtable pdEnv=new Hashtable();
pdEnv.put(Context.INITIAL\u Context\u工厂,“com.ibm.websphere.naming.WsnInitialContextFactory”);
pdEnv.put(Context.PROVIDER\u URL,“iiop://localhost:2810");
Context initialContext=新的initialContext(pdEnv);
注意: 我们可以通过下面的方式找到iiop协议的监听端口

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

然后您可以找到端口名引导\u地址的端口

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

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.");
}
Hashtable pdEnv=new Hashtable();
pdEnv.put(Context.INITIAL\u Context\u工厂,“com.ibm.websphere.naming.WsnInitialContextFactory”);
pdEnv.put(Context.PROVIDER\u URL,“iiop://localhost:2810");
Context initialContext=新的initialContext(pdEnv);
DataSource DataSource=(DataSource)initialContext.lookup(“testDS”);
if(数据源!=null){
connection=datasource.getConnection(“admin”,“admin”);//DB credintials
}否则{
LOGGER.info(“未能查找数据源”);
}
注意:我在websphere(版本7)中创建了数据源,JNDI名称为testDS 我们必须在类路径中添加com.ibm.ws.ejb.thinclient_7.0.0.jarjar


感谢Sean F和PhilipJ在这个问题上的支持。

也许吧?谢谢你。我尝试了您的解决方案,但遇到了相同的问题。在这种情况下,您不能使用逻辑名称(java:comp…),您必须使用真实的JNDI资源名称。签入管理控制台。我只使用了JNDI名称,然后我没有得到上面的错误,但是当我创建连接时,我得到了“EVERE:Cannot get connection:java.sql.SQLException:callDSRA0010E中的无效参数:sql State=null,错误代码=17433”异常。谢谢PhilipJ。但是在我根据你的建议修改代码之后,我得到了NameNotFoundException。我已经在我的类路径中添加了上述三个JAR。但是没有运气。得到同样的问题。你能把你的异常粘贴到这里吗?我提到了WebSphere客户端JAR也要添加到你的类路径中。从C:\Program Files\IBM\SDP\runtimes\base\u v70\runtimes这是怎么回事?这样行吗?您可能需要将oracle JDBC驱动程序添加到类路径中,我已经用DB2驱动程序进行了测试。