首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Liberty配置文件的JSR-352 - 'ORA-01002: fetch out of sequence‘

带有Liberty配置文件的JSR-352 - 'ORA-01002: fetch out of sequence‘
EN

Stack Overflow用户
提问于 2017-02-16 03:44:55
回答 1查看 418关注 0票数 2

我正在Liberty Profile中试验JSR-352实现,在我的阅读器处理了我的JDBC ResultSet的前10项之后,我被一个'ORA-01002: fetch of sequence‘错误给难住了。我的块大小设置为100。

这是我的读者:

代码语言:javascript
复制
@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 ()方法中,那么我不会遇到任何错误。

以下是我的server.xml中的batchPersistence配置:

代码语言:javascript
复制
<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中的错误:

代码语言:javascript
复制
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

我有额外的日志等,如果他们会有帮助的话。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-02-16 04:21:56

不要跨线程缓存JDBC语句或ResultSet实例。JDBC编程模型不支持多线程访问,这可能是您遇到此错误的原因。这也是为什么它在open方法中运行良好的原因,该方法运行在单个线程上。当使用JDBC时,可以缓存DataSource,但不可以缓存连接或连接下的任何内容。让应用服务器管理连接和语句池,它以线程安全的方式做到这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42258663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档