我正在尝试使用带有Spring Boot的MyBatis Cursor来迭代大型查询:
制图员:
@Mapper
@Repository
interface UserMapper {
@Select("SELECT * FROM huge_user_table")
Cursor<User> getUsers();
消费者:
@Component
public class UserProcessor {
@Autowired private UserMapper userMapper;
public boolean process() throws IOException {
Cursor<User> users = userMapper.getUsers();
//users.isOpen() == false
for (User user : users) {
//Never iterates
System.out.println(user.getId());
}
当我把光标关闭但是没有记录返回时 .
我错过了什么吗?
1 回答
最有可能的问题是您尝试在事务之外使用
Cursor
. 这不受支持 .Cursor
基本上是JDBCResultSet
的包装器 . 为了从Cursor
获取值,应该打开底层ResultSet
. 如果在循环的整个持续时间内没有事务,则spring将在执行查询时打开连接(在您的情况下为getUsers
方法的持续时间) . 方法完成后,连接将关闭,因此Cursor
使用的ResultSet
也将关闭 .将
@Transactional
添加到process
,这应该可以解决问题 .