带Spring Boot的MyBatis光标

问题描述 投票:0回答:1

我正在尝试使用带有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());
        }

当我将光标关闭时,虽然它已关闭,但没有返回任何记录。

我错过了什么吗?

spring-boot mybatis spring-mybatis
1个回答
1
投票

最有可能的问题是你试图在交易之外使用Cursor。这不受支持。

Cursor基本上是JDBC ResultSet的包装器。为了从Cursor获取值,应该打开底层的ResultSet。如果在循环的整个持续时间内没有事务,则spring将在执行查询时打开连接(在您的情况下为getUsers方法的持续时间)。方法完成后,连接关闭,因此ResultSet使用的Cursor也关闭。

@Transactional添加到process,这应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.