首页 文章

带有Spring Boot 2.0.3的MyBatis光标

提问于
浏览
0

我正在尝试使用带有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 回答

  • 1

    最有可能的问题是您尝试在事务之外使用 Cursor . 这不受支持 .

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

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

相关问题