Приложение, использующее соединения JDBC в пуле

Я работаю с устаревшим приложением WebLogic, которое содержит приложение веб-службы и автономное приложение командной строки. Оба нуждаются в доступе к общей базе данных, и я хотел бы попытаться заставить приложение командной строки использовать объединенное соединение с соединением 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. Я могу подключиться к базе данных с другими веб-приложениями, но мое автономное приложение по-прежнему испытывает трудности. - Идея для этого появилась у меня в примечании к приложению WebLogic. .

Любые идеи о том, что я упустил из виду?

EDIT 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)

person Nate    schedule 21.04.2009    source источник
comment
Было бы полезно, если бы вы сказали нам, что такое исключение.   -  person Jon Skeet    schedule 21.04.2009
comment
java.lang.Object не является исключением.   -  person jsight    schedule 21.04.2009
comment
Возможно, попробуйте: Object dsObj = ctx.lookup(dbOracle); System.out.println(Объект был: + dsObj.getClass().getName()); чтобы увидеть, действительно ли вы получаете то, что думаете?   -  person jsight    schedule 21.04.2009
comment
Я думаю, что полная трассировка стека была бы полезна   -  person jsight    schedule 21.04.2009
comment
Можете ли вы рассказать нам, какие дополнительные библиотеки вы включили в свое автономное приложение?   -  person ruslan    schedule 21.04.2009
comment
Какую версию WebLogic вы используете?   -  person Gary    schedule 22.04.2009


Ответы (7)


Это исключение выглядит так, как будто оно генерируется на стороне сервера. Первое, что я бы сделал, это проверил версию WebLogic Server и путь к классам клиентского приложения. Вы должны убедиться, что ваше клиентское приложение имеет ту же версию клиентских JAR-файлов WebLogic, что и WebLogic Server. Вы включаете файлы jar клиента weblogic в путь к классам вашего клиента, верно? Поскольку вы используете драйвер RMI WebLogic, я не думаю, что вам нужны какие-либо файлы jar Oracle в пути к классам клиента. Ваш клиент, по сути, говорит RMI с сервером WebLogic. Настроенный вами пул соединений WebLogic Server знает, как обращаться к Oracle. Не имеет значения, какой драйвер JDBC вы используете в пуле соединений.

person Gary    schedule 22.04.2009
comment
Я не включал JAR-файлы клиента WebLogic в путь к классам приложения. Спасибо! - person Nate; 23.04.2009
comment
Да, это не очевидно, если только посмотреть на операторы импорта вашего кода, что вам это нужно. Компилятор не будет жаловаться, но приведение искомого объекта вызовет рвоту. - person Gary; 23.04.2009

Возможно, проблема с classpath или даже с версией jvm?

person KarlP    schedule 21.04.2009

Возможно, файлы JAR для драйвера Oracle на клиентской JVM отличаются от файлов на сервере. убедитесь, что один и тот же jar драйвера Oracle JDBC находится как в путях к классам инструмента командной строки, так и в веб-приложении weblogic.

удачи !

person Oren Yosifon    schedule 21.04.2009

Я думаю, что эта проблема решается выполнением bea или weblogic\user_projects\domains\base_domain\bin>setDomainEnv.cmd

person sathish    schedule 01.06.2012

Трудно сказать, что происходит с такой ограниченной информацией.

Вы настроили приложение как тонкий клиент? Когда вы не работаете в одном из контейнеров Java EE, контекст и средства поиска не работают одинаково (зависит от поставщика). Возможно, вы захотите узнать, как выполнять поиск ресурсов с помощью Weblogic из такого клиента, а также как правильно его настроить.

person Robin    schedule 21.04.2009
comment
Я только что добавил дополнительную информацию. Я надеюсь, что это будет полезно. - person Nate; 22.04.2009

Одна возможность: вы импортируете неправильный класс "DataSource" :-)

Попробуйте заменить эту строку кода:

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

за это:

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

Просто идея, надеюсь, это поможет вам

person sourcerebels    schedule 21.04.2009

У меня была аналогичная проблема, но исправленная после создания 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();
    }

Даже я могу вызвать его из отдельного весеннего приложения...

<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>
person Ahmed    schedule 12.11.2014