2017-02-15 8 views
2

Я экспериментирую с реализацией JSR-352 в профиле Liberty и не согласен с ошибкой «ORA-01002: fetch out of sequence» после того, как мой читатель обработает первые 10 элементов моего JDBC ResultSet. Мой размер блока устанавливается равным 100.JSR-352 с профилем Liberty - 'ORA-01002: выборка из последовательности'

Вот мой читатель:

@Dependent 
@Named("myItemReader") 
public class MyItemReader extends AbstractItemReader { 

    @Resource(name="jdbc/somedb",shareable=false) 
    private DataSource lavDb; 

    private PreparedStatement stmt; 
    private ResultSet rs; 

    @Override 
    public void open(Serializable checkpoint) throws Exception { 
     Connection con = lavDb.getConnection(); 
     con.setAutoCommit(false); 
     stmt = con.prepareStatement("select id from sometable", 
       ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 
     rs = stmt.executeQuery(); 
    } 

    @Override 
    public MyInputRecord readItem() throws Exception{ 
     if(rs.next()){ 
      return new MyInputRecord(rs.getInt(1)); 
     } 
     return null; 
    } 

    @Override 
    public void close(){ 
     try{ 
      rs.close(); 
      stmt.close(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

Если обработка ResultSet происходит в методе Open(), то я не возникнут какие-либо ошибки.

Вот моя конфигурация batchPersistence от моего server.xml:

<dataSource id="oracle-wasadmin" jdbcDriverRef="wasoracledriver" jndiName="jdbc/wasoracledb" type="javax.sql.XADataSource"> 
    <properties.oracle URL="${wasadmin.jdbcurl}" password="xxxxxx" user="yyyyyy"/> 
    <conionManager agedTimeout="1m" maxIdleTime="15m" maxPoolSize="25" minPoolSize="0"/> 
</dataSource> 

<jdbcDriver id="wasoracledriver" javax.sql.XADataSource="oracle.jdbc.xa.client.OracleXADataSource"> 
    <library> 
     <fileset dir="${shared.resource.dir}/oracle" includes="*.jar"/> 
    </library> 
</jdbcDriver> 

Здесь ошибка в просмотре списка:

com.ibm.jbatch.container.exception.BatchContainerRuntimeException: Failure in Read-Process-Write Loop 
    at com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.invokeChunk(ChunkStepControllerImpl.java:702) 
    at com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.invokeCoreStep(ChunkStepControllerImpl.java:792) 
    at com.ibm.jbatch.container.controller.impl.BaseStepControllerImpl.execute(BaseStepControllerImpl.java:292) 
    at com.ibm.jbatch.container.controller.impl.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:118) 
    at com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl.executeCoreTransitionLoop(WorkUnitThreadControllerImpl.java:94) 
    at com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl.executeWorkUnit(WorkUnitThreadControllerImpl.java:155) 
    at com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl$AbstractControllerHelper.runExecutionOnThread(WorkUnitThreadControllerImpl.java:480) 
    at com.ibm.jbatch.container.controller.impl.WorkUnitThreadControllerImpl.runExecutionOnThread(WorkUnitThreadControllerImpl.java:90) 
    at com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:117) 
    at com.ibm.ws.context.service.serializable.ContextualRunnable.run(ContextualRunnable.java:80) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: com.ibm.jbatch.container.exception.BatchContainerRuntimeException: java.sql.SQLException: ORA-01002: fetch out of sequence 

    at com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.readItem(ChunkStepControllerImpl.java:354) 
    at com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.readAndProcess(ChunkStepControllerImpl.java:245) 
    at com.ibm.jbatch.container.controller.impl.ChunkStepControllerImpl.invokeChunk(ChunkStepControllerImpl.java:626) 
    ... 14 more 
Caused by: java.sql.SQLException: ORA-01002: fetch out of sequence 

У меня есть дополнительные журналы и т.д., если они было бы полезно. Заранее спасибо.

+0

Хотя вы не относитесь к своему исключению, я предполагаю, что «conionManager» в вашем server.xml является опечаткой? –

+0

Да, это опечатка в сообщении, server.xml имеет правильное значение. –

+0

Вы пытались добавить флаг 'ResultSet.HOLD_CURSORS_OVER_COMMIT' другим пользователям вашего ** prepareStatement **? –

ответ

2

Не кэшируйте записи JDBC или экземпляры ResultSet по потокам. Модель программирования JDBC не поддерживает многопоточный доступ, что, вероятно, связано с тем, что вы используете эту ошибку. А также, почему он отлично работает в рамках открытого метода, который работает на одном потоке. При использовании JDBC можно кэшировать DataSource, но не соединение или что-либо под соединением. Пусть сервер приложений управляет объединением соединений и выражений, которые он выполняет поточно-безопасным способом.

+0

Идея состоит в том, чтобы эффективно прокручивать результирующий набор через один запрос вместо настройки Connection, Statement и ResultSet при каждом вызове readItem. Я также использовал эту статью в качестве руководства: http: //www.radcortez.com/java-ee-7-batch-processing-and-world-of-warcraft-part-2/ –

+0

Я не заметил, что эта партия используется, поэтому операции фактически выполняются в одном потоке, но совет по-прежнему применяется, если oracle не позволяет держать курсор открытым через транзакцию транзакции xa. – njr

+0

Случайное нажатие в ближайшее время. Вот остальная часть комментария. Эта статья, вероятно, написана для однофазного источника данных, который из представления драйвера JDBC будет скорее чем connection.commit, чем xa commit, что может позволить вам продолжить использование курсора. Следует также отметить, что при использовании этого подхода очень важно убедиться, что вы закрываете свое соединение методом close, чтобы он не просочился. – njr

Смежные вопросы