Я пытаюсь использовать курсор MyBatis с Spring Boot2.0.3 (mybatis3.5.4, mybatis-plus3.1.2, duridjdbc1.1.21, mysql -connect5.0.17) для итерации большого запроса. для Mysql я видел Курсор MyBatis с Spring Boot , но он все еще не работает.
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 будет читать все данные.