首页 > 解决方案 > mybatis cursor mysql 语句关闭后不允许操作

问题描述

我正在尝试将 MyBatis Cursor 与 Spring Boot2.0.3(mybatis3.5.4,mybatis-plus3.1.2,duridjdbc1.1.21,mysql-connect5.0.17) 一起使用来迭代大型查询。对于 Mysql,我在Spring Boot 中看到了 MyBatis Cursor, 但它仍然无法正常工作。

xml:

<select id="fetchListByCreateDate" fetchSize="-2147483648"  statementType="PREPARED" resultSetType="FORWARD_ONLY" resultType="entityClass">
     SELECT
     *
     FROM table
     ORDER BY create_date DESC
 </select>

服务:

    @Override
    @Transactional //**delete it**
    //**change it to** List<entityClass> ......
    public Cursor<entityClass> fetchListByCreateDate() {
        return this.mapper.fetchListByCreateDate();
    }

当我调用

        //**change it** List<entityClass> item = serivce.fetchListByCreateDate();
        Cursor<entityClass> item = serivce.fetchListByCreateDate();
        Iterator<entityClass> iter = item.iterator();
        List<entityClass> list = new ArrayList<>();
        while (iter.hasNext()) {
            // Fetch next 10 employees
            for (int i = 0; i < 100 && iter.hasNext(); i++) {
                list.add(iter.next());
            }
            list.clear();
        }

然后:

Cause: java.sql.SQLException: No operations allowed after statement closed.
; ]; No operations allowed after statement closed.; nested exception is java.sql.SQLException: No operations allowed after statement closed.

    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:110)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
    at com.sun.proxy.$Proxy152.selectCursor(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.selectCursor(SqlSessionTemplate.java:206)

将 Cursor 更改为 List 然后 Mybatis 将读取所有数据。

标签: javamysqlcursormybatis

解决方案


推荐阅读