【问题标题】:MyBatis Cursor with Spring Boot带有 Spring Boot 的 MyBatis 光标
【发布时间】:2019-01-10 07:32:30
【问题描述】:

我正在尝试使用带有 Spring Boot 的 MyBatis 游标来迭代大型查询:

映射器:

@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】:

    问题很可能是您尝试在事务之外使用Cursor。这不受支持。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 2018-01-11
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      相关资源
      最近更新 更多