MyBatis-Plus Lambda查询会话超时设置

2 阅读1分钟

在 MyBatis-Plus 中,若需针对特定 Lambda 查询设置会话超时时间(而非全局或拦截器),可通过 SqlSession 临时配置 实现。以下是具体步骤:

解决方案:使用 SqlSession 手动控制超时

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

public void queryWithCustomTimeout() {
    // 获取 MyBatis 的 SqlSessionFactory
    SqlSessionFactory sqlSessionFactory = SqlHelper.sqlSessionFactory(YourEntity.class);
    
    try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
        // 设置当前会话超时时间(单位:秒)
        sqlSession.getConfiguration().setDefaultStatementTimeout(10); // 10秒超时

        // 创建 LambdaQueryWrapper
        LambdaQueryWrapper<YourEntity> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(YourEntity::getStatus, 1);

        // 通过 SqlSession 获取 Mapper 并执行查询
        YourMapper mapper = sqlSession.getMapper(YourMapper.class);
        List<YourEntity> result = mapper.selectList(wrapper);
        
        // 处理结果...
    } // SqlSession 自动关闭,超时设置仅限当前会话
}

关键点说明:

  1. 局部会话控制

    • 通过 SqlSessionFactory 创建临时 SqlSession
    • 在 try-with-resources 块中操作,确保会话自动关闭。
  2. 动态设置超时

    • setDefaultStatementTimeout(10) 设置当前会话内所有语句的超时时间。
    • 仅影响当前 SqlSession,不干扰全局配置。
  3. Lambda 查询兼容

    • 正常使用 LambdaQueryWrapper 构建查询条件。
    • 通过 sqlSession.getMapper() 获取 Mapper 代理执行查询。
  4. 超时作用范围

    • 超时设置仅对当前 SqlSession 内的操作生效。
    • 会话结束后,配置自动失效,不影响其他请求。

适用场景:

  • 需要对特定复杂查询单独设置超时时间。
  • 避免全局配置影响其他快速操作。
  • 不引入额外拦截器,保持代码轻量。

注意:此方案通过 SqlSession 临时覆盖配置,确保每次需要自定义超时的手动管理会话。如需更细粒度控制(如单个语句超时),可进一步通过 MyBatis 原生 @Options 注解实现(需自定义 Mapper 方法)。