0

我正在使用一个旧的 WebLogic 应用程序,该应用程序包含一个 Web 服务应用程序和一个独立的命令行应用程序。两者都需要访问公共数据库,我想尝试让命令行应用程序使用与 Web 服务器的 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 应用笔记中得到了这个想法。

关于我忽略了什么的任何想法?

编辑 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"

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

"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)
4

7 回答 7

1

很难用如此有限的信息来判断发生了什么。

您是否将应用程序设置为瘦客户端?当您不在其中一个 Java EE 容器中操作时,执行查找的上下文和方法不会以相同的方式工作(因供应商而异)。您可能想研究如何从这样的客户端使用 Weblogic 查找资源,以及如何正确设置它。

于 2009-04-21T19:30:07.307 回答
1

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

于 2009-04-21T19:36:48.180 回答
1

您在客户端 JVM 中用于 Oracle 驱动程序的 JAR 可能与服务器中的 JAR 不同。确保命令行工具和 weblogic webapp 的类路径中都有相同的 Oracle JDBC 驱动程序 jar

祝你好运 !

于 2009-04-21T21:50:42.057 回答
1

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

于 2009-04-22T16:45:26.600 回答
1

我认为这个问题可以通过执行 bea 或 weblogic\user_projects\domains\base_domain\bin>setDomainEnv.cmd 来解决

于 2012-06-01T14:56:58.647 回答
0

一种可能性:您导入了不正确的“DataSource”类:-)

尝试替换这行代码:

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

为了这:

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

只是一个想法,希望对你有帮助

于 2009-04-21T20:39:40.057 回答
0

我遇到了类似的问题,但在创建 wlfullclient.jar 并将其保存在类路径中后得到了修复。

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

服务器:weblogic 10.3.6

DS JNDI:jdbc/hr

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();
    }

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

<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>
于 2014-11-12T20:50:07.813 回答