2017-02-15 38 views
2

我正在试验Liberty Profile中的JSR-352实现,并被'ORA-01002:抓取乱序错误在我的读者处理我的JDBC ResultSet的前10项后。我的块大小设置为100JSR-352与Liberty Profile - '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(); 
     } 
    } 
} 

如果open()方法时ResultSet中处理那么我不会遇到任何错误。

这是从我的server.xml我batchPersistence配置:

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

这里是在joblog错误:

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

虽然不是相对于你的异常,我假设你的server.xml中的“conionManager”是一个错字? –

+0

是的,这是文章中的错字,server.xml具有正确的值。 –

+0

您是否尝试在** prepareStatement **中向其他人添加ResultSet.HOLD_CURSORS_OVER_COMMIT标志? –

回答

2

请勿在线程中缓存JDBC Statement或ResultSet实例。 JDBC编程模型不支持多线程访问,这可能是您遇到此错误的原因。还有为什么它可以在单线程运行的open方法中正常工作。在使用JDBC时,可以缓存DataSource,但不能连接或Connection之下的任何东西。让应用程序服务器管理连接和语句的池,它以线程安全的方式进行。

+0

这个想法是通过单个查询有效地滚动结果集,而不是在每个readItem调用上设置Connection,Statement和ResultSet。我也在使用这篇文章作为指导:http://www.radcortez。com/java -ee-7-batch-processing-and-world-of-warcraft-part-2/ –

+0

我忽略了那个批处理被使用,所以这些操作实际上是在同一个线程上运行的,但是这个通知仍然适用于if oracle不允许在xa事务提交中保持光标打开。 – njr

+0

意外按下即可进入。这是评论的其余部分。 您找到的文章可能只写入了一个单阶段数据源,它从JDBC驱动程序的视图中将是connection.commit而不是xa commit,这可能允许您继续使用游标。我还应该指出,如果使用这种方法,确保在close方法中关闭连接非常重要,这样它就不会泄漏。 – njr

相关问题