0

Web サービス アプリケーションとスタンドアロンのコマンドライン アプリケーションを含むレガシー WebLogic アプリケーションを使用しています。どちらも共通のデータベースにアクセスする必要があるため、コマンドライン アプリケーションで Web サーバーの JDBC 接続へのプールされた接続を使用できるようにしたいと考えています。(スタンドアロン アプリケーションは、サーバーがアクティブな場合にのみ実行でき、両方が同じ物理マシン上で実行されます。)

次のように、JDBCドライバーへのJNDIルックアップを使用しようとしました。

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

この例外は、サーバー側で生成されたように見えます。最初に行うことは、WebLogic Serverのバージョンを確認し、クライアントアプリケーションのクラスパスを確認することです。クライアントアプリに、WebLogicServerと同じバージョンのWebLogicクライアントjarファイルがあることを確認する必要があります。クライアントのクラスパスにweblogicクライアントjarファイルを含めていますよね?WebLogicのRMIドライバを使用しているため、クライアントのクラスパスにOraclejarファイルは必要ないと思います。クライアントは基本的に、WebLogicServerに対してRMIを話します。構成したWebLogicServer接続プールは、Oracleとの通信方法を認識しています。接続プールで使用するJDBCドライバーは重要ではありません。

于 2009-04-22T16:45:26.600 に答える
1

そのような限られた情報では何が起こっているのかを知るのは困難です。

アプリケーションをシン クライアントとしてセットアップしましたか? いずれかの Java EE コンテナー内で操作していない場合、ルックアップを実行するコンテキストと手段は同じようには機能しません (ベンダーによって異なります)。そのようなクライアントから Weblogic を使用してリソースのルックアップを行う方法と、それを正しく設定する方法を調査することをお勧めします。

于 2009-04-21T19:30:07.307 に答える
1

この問題は bea または weblogic\user_projects\domains\base_domain\bin>setDomainEnv.cmd を実行することで解決すると思います

于 2012-06-01T14:56:58.647 に答える
1

おそらくクラスパスの問題か、jvm のバージョンの問題でしょうか?

于 2009-04-21T19:36:48.180 に答える
1

クライアント JVM 内の Oracle ドライバー用の JAR が、サーバー内のものと異なる可能性があります。同じ Oracle JDBC ドライバー jar がコマンドライン ツールと weblogic webapp の両方のクラスパスにあることを確認してください。

幸運を !

于 2009-04-21T21:50:42.057 に答える
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>
于 2014-11-12T20:50:07.813 に答える
0

1 つの可能性: 間違った「DataSource」クラスをインポートします :-)

次のコード行を置き換えてみてください。

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

このため:

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

単なるアイデアです。これが役に立てば幸いです

于 2009-04-21T20:39:40.057 に答える