DB2 SQL 错误:jpa 分页项阅读器抛出 SQLCODE=-270 异常

Posted

技术标签:

【中文标题】DB2 SQL 错误:jpa 分页项阅读器抛出 SQLCODE=-270 异常【英文标题】:DB2 SQL Error: SQLCODE=-270 exception thrown by jpa paging item reader 【发布时间】:2015-06-24 16:32:58 【问题描述】:

我创建了一个带有项目读取器、项目处理器和项目编写器的 spring 批处理服务。我扩展了 AbstractPagingItemReader 并创建了自己的实现,名为 JpaPagingItemReader。现在,当我运行批处理服务时,阅读器读取了一个修复集来自 db 的记录(默认页面大小:10),处理它们并写入它们。但是在第二次读取时它抛出了以下异常:

2015-06-25 16:33:00,712 ERROR [jobLauncherTaskExecutor-6][saeedh:120659] org.hibernate.util.JDBCExceptionReporter : DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.61.65
2015-06-25 16:33:00,712 ERROR [jobLauncherTaskExecutor-6][saeedh:120659] org.hibernate.util.JDBCExceptionReporter : DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.61.65
2015-06-25 16:33:00,712 ERROR [jobLauncherTaskExecutor-6][saeedh:120659] org.hibernate.util.JDBCExceptionReporter : DB2 SQL Error: SQLCODE=-727, SQLSTATE=56098, SQLERRMC=2;-270;42997;63, DRIVER=3.61.65
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query
com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-270, SQLSTATE=42997, SQLERRMC=63, DRIVER=3.61.65
    at com.ibm.db2.jcc.am.ed.a(ed.java:676)
    at com.ibm.db2.jcc.am.ed.a(ed.java:60)
    at com.ibm.db2.jcc.am.ed.a(ed.java:127)
    at com.ibm.db2.jcc.am.gn.c(gn.java:2554)
    at com.ibm.db2.jcc.am.gn.d(gn.java:2542)
    at com.ibm.db2.jcc.am.gn.a(gn.java:2034)
    at com.ibm.db2.jcc.am.hn.a(hn.java:6500)
    at com.ibm.db2.jcc.t4.cb.g(cb.java:140)
    at com.ibm.db2.jcc.t4.cb.a(cb.java:40)
    at com.ibm.db2.jcc.t4.q.a(q.java:32)
    at com.ibm.db2.jcc.t4.rb.i(rb.java:135)

我知道这个错误可能是因为我正在读取记录的表中有一个 CLOB 列,但奇怪的是它可以很好地读取第一批 10 条记录,处理它们并写入它们,但在第二次读取它抛出了上述异常。有什么建议吗?下面是我写的 JpaPagingItemReader 的 sn-p。AbstractPagingItemReader.java 中的覆盖 doReadPage 方法。

protected void doReadPage ()
    
        setPageSize (10);
        // Flush we already have in entity manager
        getEntityManager ().flush ();

        // clear the entity manager: To read and detach
        getEntityManager ().clear ();

        Query query = createQuery ().setFirstResult (getPage () * getPageSize ()).setMaxResults (getPageSize ());

        if (parameterValues != null)
        
            for (Map.Entry<String, Object> me : parameterValues.entrySet ())
            
                query.setParameter (me.getKey (), me.getValue ());
            
        

        if (results == null)
        
            results = new CopyOnWriteArrayList<T> ();
        
        else
        
            results.clear ();
        

        results.addAll (query.getResultList ());

        // Detach all objects that became part of persistence context
        getEntityManager ().clear ();

    

非常感谢任何帮助,因为由于此问题,我已经落后于截止日期。如果您认为缺少任何内容,请告诉我,我会更新问题。谢谢。

【问题讨论】:

也许这个 CLOB 在前几行是空的?喜欢懒得发消息的数据库,只是希望人们以某种​​方式查找一些错误代码...... 谢谢。不,我仔细检查了它。查询很好。我也在 DB2 客户端中运行它,它给了我正确的结果。我什至尝试在模型对象的数据字段上放置 @lob 注释,但是没有变化。无论我设置的页面大小是多少,我仍然在每秒读取记录时遇到相同的异常。如果是 10,那么接下来的 10 条记录是异常,如果是 2,那么接下来的 2 条记录是异常。 您是否已经环顾四周? ***.com/questions/12686832/… ? 是的@MIchael 我确实遇到了您提供的链接,但我的情况有点不同。在我的情况下,我可以从 db 读取第一批记录,并且我的 Clob 数据读取良好。我可以处理这些单独的记录并将它们写在我想要的地方。但是在第二次阅读时,我得到了一个有点奇怪的异常。 您是否尝试使用数据库工具从第二个块中读取数据?也许是数据本身 【参考方案1】:

我想通了。问题确实是我们不允许将 Clob 数据作为可滚动 JPA 游标中的投影。前 10 条记录读取得很好,但是一旦它开始读取第二批它必须将光标从 0 移动到第 11 条记录。那是我遇到 sql 异常的时候。

简单的解决方法是从 select 语句中删除 CLOB 列,并在需要其值的单独查询中获取它。这解决了我的问题。谢谢。

【讨论】:

以上是关于DB2 SQL 错误:jpa 分页项阅读器抛出 SQLCODE=-270 异常的主要内容,如果未能解决你的问题,请参考以下文章

当我使用它与db2进行分页时,我的下一页是错误的

spring jpa Specification 分页查询遇到的问题

怎么用JPA查询数据的前一条数据

DB2DataAdapter.Fill(dataset) 抛出错误“SQL0901N(原因“CPF4273”。)SQLSTATE=58004”

带有 DB2 错误 SqlSyntaxErrorException 的 Spring JPA

db2分页技术优化问题: