WSJDBCConnection не оборачивает объекты типа Oracle jdbc Connection

Я использую сервер Websphere Liberty для запуска своего приложения, и мне нужно использовать ArrayDescriptor для передачи массивов в хранимую процедуру оракула. Я получаю исключение при развертывании соединения. Я также проверил информацию о драйвере метаданных соединения, и он показывает мне драйвер oracle.jdbc. Код не работает в строке развертывания соединения.

Connection conn = this.getDataSource().getConnection();
OracleConnection oracleConn = conn.unwrap(oracle.jdbc.OracleConnection.class); 

Сообщение об исключении: java.sql.SQLException: DSRA9122E: com.ibm.ws.rsadapter.jdbc.v41.WSJdbc41Connection@120edaf не содержит объектов типа oracle.jdbc.OracleConnection.

Я также добавил ссылку на загрузчик классов для своего приложения в server.xml, но это не помогло.

Мой server.xml выглядит так:

<dataSource  id="datasource" jndiName="jdbc/XXXXXX" 
type="javax.sql.XADataSource">
<jdbcDriver libraryRef="ordLib"/>
<properties.oracle databaseName="XXXX" driverType="thin" password="XXXXXX" 
portNumber="XXXXXX" serverName="XXXXXX" serviceName="XXXXXX" url="XXXXXX" 
user="XXXXXX"/>
</dataSource>

<webApplication id="NAExtractWeb" location="NAExtractWeb.war" 
name="NAExtractWeb">
<classloader commonLibraryRef="ordLib"></classloader>
</webApplication>

<library id="ordLib">
    <fileset dir="C:\lib" id="fileset" includes="ojdbc6-11.2.0.4.jar"/>
</library> 

Также я использую эту функцию развертывания в одном из моих зависимых файлов jar проекта, и у меня есть зависимость ojdbc (maven), добавленная в мой зависимый проект. Повлияет ли это на этап распаковки?

Вот метод, который получит источник данных:

 public DataSource getDataSource(String dsName) throws BatchException {

    try {
        return (DataSource) new InitialContext().lookup(dsName);
    } catch (Exception e) {
            //Code to handle
    }
}

Вот полная трассировка стека:

Я только что проверил это на WebSphere Liberty, и у меня сработал следующий код:


person Edge    schedule 19.06.2018    source источник
comment
Область jar зависимостей ojdbc была настроена так, чтобы не добавлять ее в сборку и только для компиляции. После его добавления код выдает мне NoClassDefErro r в строке развертывания.   -  person Mark Rotteveel    schedule 19.06.2018
comment
Можете ли вы опубликовать полную трассировку стека? Возможно, это даст нам больше идей.   -  person Edge    schedule 19.06.2018
comment
У вас есть драйвер Oracle, упакованный в ваше приложение или каким-либо образом в ваш путь к классам (кроме конфигурации, которую вы уже предоставили)?   -  person Andy Guibert    schedule 19.06.2018
comment
Да, Алекс. Я включил зависимость ojdbc в свой проект и установил область действия. Вы хотите, чтобы я полностью удалил зависимость? Если я попытаюсь удалить его, я получаю ошибку компиляции. знаете ли вы какой-либо другой способ использовать только одну банку как для компиляции, так и во время выполнения?   -  person Alex Motley    schedule 19.06.2018
comment
adara muthu - единственное решение для этого.   -  person Edge    schedule 20.06.2018
comment
Можете ли вы также включить свою конфигурацию _1_? это релевантная конфигурация для определения проблемы   -  person kaushalpranav    schedule 20.06.2018


Ответы (3)


Мой server.xml выглядит так:

@Resource(lookup = "jdbc/oracle")
private DataSource ds;

// ...

Connection conn = ds.getConnection();
OracleConnection oracleConn = conn.unwrap(oracle.jdbc.OracleConnection.class);

Здесь важно отметить использование commonLibraryRef в элементе <classloader>. Если вы используете privateLibraryRef, это не будет работать, потому что приложение и определенный сервером источник данных будут использовать изолированные загрузчики классов для загрузки классов Oracle JDBC.

<dataSource jndiName="jdbc/oracle">
    <jdbcDriver libraryRef="oracleLib"/>
    <properties.oracle URL="${jdbc.URL}" user="${jdbc.user}" password="${jdbc.password}"/>
</dataSource>

<library id="oracleLib">
    <fileset dir="${server.config.dir}/oracle"/>
</library>

<application location="myApp.war" >
    <classloader commonLibraryRef="oracleLib"/>
</application>

Если этот ответ вам не помог, обновите свой вопрос, указав конфигурацию server.xml, а также то, как вы получаете экземпляр вашего DataSource.

Если у кого-то есть эта проблема, вот мое решение.

person Andy Guibert    schedule 19.06.2018
comment
Добавлен тег приложения с commonLibraryRef, указывающим на ту же библиотеку ordLib. - person Andy Guibert; 19.06.2018
comment
[19.06.18 17:20:29:340 IST] [раздел процесса0] com.ibm.ws.batch.JobLogger CWWKY0030I: При выполнении пошагового процесса возникла исключительная ситуация. com.ibm.jbatch.container.exception.BatchContainerRuntimeException: сбой в цикле чтения-процесса-записи в com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.invokeChunk(ChunkStepControllerImpl.java:704) в com.ibm.jbatch. container.controller.impl.ChunkStepControllerImpl.invokeCoreStep(ChunkStepControllerImpl.java:795) в com.ibm.jbatch.container.controller.impl.BaseStepControllerImpl.execute(BaseStepControllerImpl.java:293) в com.ibm.jbatch.container.controller. impl.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:118) в com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl.executeCoreTransitionLoop(WorkUnitThreadControllerImpl.java:93) в com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl. executeWorkUnit(WorkUnitThreadControllerImpl.java:155) в com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl$AbstractControllerHelper.runExecutionOnThread(WorkUnitThreadControllerImpl.java :480) в com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl.runExecutionOnThread(WorkUnitThreadControllerImpl.java:89) в com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:117) в com. ibm.ws.context.service.serializable.ContextualRunnable.run(ContextualRunnable.java:79) в java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) в java.util.concurrent.FutureTask.run( FutureTask.java:266) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) в java.lang.Thread.run (Thread.java:745) Причина: com.ibm.jbatch.container.exception.BatchContainerRuntimeException: java.sql.SQLException: DSRA9122E: com.ibm.ws.rsadapter.jdbc.v41.WSJdbc41Connection@73c25e77 не упаковывает объекты типа oracle.jdbc.OracleConnection. в com.ibm.jbatch.container.artifact.proxy.ItemWriterProxy.open(ItemWriterProxy.java:67) в com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.openReaderAndWriter(ChunkStepControllerImpl.java:954) в com.ibm .jbatch.container.controller.impl.ChunkStepControllerImpl.invokeChunk(ChunkStepControllerImpl.java:599) ... еще 14 Вызвано: java.sql.SQLException: DSRA9122E: com.ibm.ws.rsadapter.jdbc.v41. WSJdbc41Connection@73c25e77 не упаковывает никакие объекты типа oracle.jdbc.OracleConnection. в com.ibm.ws.rsadapter.jdbc.WSJdbcWrapper.unwrap(WSJdbcWrapper.java:459) в com.fmr.nfiws.batch.writer.DBWriter.open(DBWriter.java:149) в com.ibm.jbatch.container .artifact.proxy.ItemWriterProxy.open(ItemWriterProxy.java:64) ... еще 16 - person Edge; 19.06.2018

Моя ошибка заключалась в том, что я развертывал свое приложение в папке dropins, и если вы определяете application/webApplication в своем server.xml, оно игнорируется. Я развернул его в другом месте, установил это новое местоположение в тег приложения, а также добавил <classloader> в server.xml, оставил ojdbc jar, как указано в pom.xml, и теперь он работает.

Но все же у меня была проблема, когда я запускал приложение локально, потому что ojdbc jar был предоставлен в pom.xml.
Мое решение состояло в том, чтобы использовать отражение, чтобы получить загрузчик системного класса и загрузить банку во время выполнения для локального профиля.

Надеюсь, это поможет кому-то.

Я пробовал то же самое на своем локальном компьютере, но не работал из-за того же файла ojdbc jar, доступного в пути к серверу времени выполнения свободы. После удаления работает нормально. LibertyRuntime (в проводнике проекта) -> серверы (выберите развернутый сервер) -> приложения-> вы можете увидеть имя приложения.war.xml (пожалуйста, удалите банку ojdbc из xml).

person Stanciu Marian Madalin    schedule 19.09.2018

Убедитесь, что jar недоступен в XML-файле. Наконец, запустите сервер, он будет работать.

У меня есть зависимость ojdbc (maven), добавленная в мой зависимый проект это, вероятно, означает, что в пути к классам есть два _1_ класса: один загружается самой Websphere для соединений, созданных для pool и один, загруженный вашим приложением. Если ваше приложение ссылается на _2_, это может привести к созданию другого класса, что приведет к сбою распаковки (поскольку они не загружаются одним и тем же загрузчиком классов). Возможно, вы захотите проверить, что произойдет, если вы явно исключите зависимость Oracle из своего проекта.

person Bibin Raj    schedule 05.04.2020