2009-04-21 81 views
0

我正在使用包含Web服务应用程序和独立命令行应用程序的遗留WebLogic应用程序。两者都需要访问公共数据库,我想尝试让命令行应用程序使用到Web服务器的JDBC连接的池连接。 (独立的应用程序可以在服务器处于活动状态,都将在同一台物理机器上运行仅运行)使用池化JDBC连接的应用程序

我一直在试图用一个JNDI查找JDBC驱动程序如下:

try { 
    Context ctx = null; 
    Hashtable ht = new Hashtable(); 
    ht.put(Context.INITIAL_CONTEXT_FACTORY, 
      "weblogic.jndi.WLInitialContextFactory"); 
    ht.put(Context.PROVIDER_URL, "t3://localhost:7001"); 

    ctx = new InitialContext(ht); 
    DataSource ds = (DataSource) ctx.lookup ("dbOracle"); 
    Connection conn = null; 
    conn = ds.getConnection(); // <-- Exception raised here 
    // conn = ds.getConnection(username, password); // (Also fails) 

    // ... 

} catch (Exception e) { 
    // Handle exception... 
} 

我已经确认JNDI名称是正确的。我可以使用其他Web应用程序连接到数据库,但我的独立应用程序仍然有困难。 - 我从WebLogic app note得到了这个想法。

关于我忽视的任何想法?

编辑1.1:我看到一个“java.lang.ClassCastException:java.lang.Object”异常。

编辑2:当我执行以下步骤:

Object dsObj = ctx.lookup("dbOracle"); 
System.out.println("Obj was: " + dsObj.getClass().getName()); 

在独立的应用程序,它报告:

"Obj was: weblogic.jdbc.common.internal._RemoteDataSource_Stub" 

我试图测试相同的代码块(描述于原始问题),并能够连接到数据源(即它似乎“工作”)。该工作测试报告:

"Obj was: weblogic.jdbc.common.internal.RmiDataSource" 

而且,这里有一个堆栈跟踪时,它的失败为:

####<Apr 22, 2009 10:38:21 AM EDT> <Warning> <RMI> <mlbdev16> <cgServer> <[ACTIVE] ExecuteThread: '0' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1240411101452> <BEA-080003> <RuntimeException thrown by rmi server: weblogic.jdbc.common.internal.RmiDataSource.getConnection() 
java.lang.ClassCastException: java.lang.Object. 
java.lang.ClassCastException: java.lang.Object 
    at weblogic.iiop.IIOPOutputStream.writeAny(IIOPOutputStream.java:1584) 
    at weblogic.iiop.IIOPOutputStream.writeObject(IIOPOutputStream.java:2222) 
    at weblogic.utils.io.ObjectStreamClass.writeFields(ObjectStreamClass.java:413) 
    at weblogic.corba.utils.ValueHandlerImpl.writeValueData(ValueHandlerImpl.java:235) 
    at weblogic.corba.utils.ValueHandlerImpl.writeValueData(ValueHandlerImpl.java:225) 
    at weblogic.corba.utils.ValueHandlerImpl.writeValue(ValueHandlerImpl.java:182) 
    at weblogic.iiop.IIOPOutputStream.write_value(IIOPOutputStream.java:1957) 
    at weblogic.iiop.IIOPOutputStream.write_value(IIOPOutputStream.java:1992) 
    at weblogic.iiop.IIOPOutputStream.writeObject(IIOPOutputStream.java:2253) 
    at weblogic.jdbc.common.internal.RmiDataSource_WLSkel.invoke(Unknown Source) 
    at weblogic.rmi.internal.BasicServerRef.invoke(BasicServerRef.java:589) 
    at weblogic.rmi.cluster.ClusterableServerRef.invoke(ClusterableServerRef.java:224) 
    at weblogic.rmi.internal.BasicServerRef$1.run(BasicServerRef.java:479) 
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:363) 
    at weblogic.security.service.SecurityManager.runAs(Unknown Source) 
    at weblogic.rmi.internal.BasicServerRef.handleRequest(BasicServerRef.java:475) 
    at weblogic.rmi.internal.BasicServerRef.access$300(BasicServerRef.java:59) 
    at weblogic.rmi.internal.BasicServerRef$BasicExecuteRequest.run(BasicServerRef.java:1016) 
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200) 
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:172) 
+0

如果你能告诉我们什么是例外情况,这将有所帮助。 – 2009-04-21 18:47:53

+0

java.lang.Object不是一个例外。 – jsight 2009-04-21 18:52:28

+2

也许尝试: 对象dsObj = ctx.lookup(“dbOracle”); System.out.println(“Obj was:”+ dsObj.getClass()。getName());看看你是否真的得到你的想法? – jsight 2009-04-21 18:53:40

回答

1

这个异常看起来像是在服务器端生成的。我要做的第一件事是验证WebLogic Server的版本并检查客户端应用程序的类路径。您需要确保您的客户端应用程序具有与WebLogic Server相同版本的WebLogic客户端jar文件。您在客户端的类路径中包含了weblogic客户端jar文件,对吗?由于您使用的是WebLogic的RMI驱动程序,我不相信您需要客户端类路径中的任何Oracle jar文件。您的客户端实质上是将RMI指向WebLogic Server。您配置的WebLogic Server连接池知道如何与Oracle通话。它不应该在连接池中使用什么JDBC驱动程序。

1

很难说是怎么回事,这样的有限的信息。

您是否将应用程序设置为瘦客户端?如果您不在其中一个Java EE容器中操作,则执行查找的上下文和手段工作方式不同(因供应商而异)。您可能想研究如何使用来自此类客户端的Weblogic查找资源,以及如何正确设置资源。

1

也许是类路径问题,甚至是jvm版本的东西?

0

一种可能性:你输入不正确 “数据源” 类:-)

尝试更换这行代码:

DataSource ds = (DataSource) ctx.lookup ("dbOracle"); 

此:

javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup ("dbOracle"); 

只是一个想法,希望这会帮助你

1

这可能是你的Oracle驱动程序的JAR在客户端JVM与服务器中的不同。请确保相同的Oracle JDBC驱动程序jar包含在命令行工具和weblogic webapp的两个类路径中。祝您好运!

1

我觉得这个问题是通过执行BEA的WebLogic或\ user_projects \域\ BASE_DOMAIN \ BIN解析>的setDomainEnv.cmd

0

我有类似的问题,但创造wlfullclient.jar并将其保存在类路径后固定。

https://docs.oracle.com/cd/E12840_01/wls/docs103/client/jarbuilder.html#wp1078098

服务器:weblogic的10.3.6

DS JNDI:JDBC /小时

DataSource dataSource = null; 
    Context ctx = null; 
    Properties p = new Properties(); 

    p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); 
    p.put(Context.PROVIDER_URL, "t3://localhost:7001"); 
    ctx = new InitialContext(p); 
    if (ctx != null) { 
     dataSource = (DataSource) ctx.lookup("jdbc/hr"); 
    } 

    if (dataSource != null) { 
     Connection connection = dataSource.getConnection(); 
     ResultSet rs = connection.createStatement().executeQuery(
       "Select sysdate from dual"); 
     while (rs.next()) { 
      System.out.println(rs.getString(1)); 
     } 
     connection.close(); 
    } 

即使我能够从独立的Spring应用程序调用它...

<bean id="applicationServerEnviromentProperties" 
    class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="properties"> 
     <props> 
      <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop> 
      <prop key="java.naming.provider.url">t3://localhost:7001</prop> 
     </props> 
    </property> 
</bean> 

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName"> 
     <value>jdbc/hr</value> 
    </property> 
    <property name="jndiEnvironment"> 
     <ref local="applicationServerEnviromentProperties" /> 
    </property> 
</bean>