在 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 自动关闭,超时设置仅限当前会话
}
关键点说明:
-
局部会话控制:
- 通过
SqlSessionFactory
创建临时SqlSession
。 - 在
try-with-resources
块中操作,确保会话自动关闭。
- 通过
-
动态设置超时:
setDefaultStatementTimeout(10)
设置当前会话内所有语句的超时时间。- 仅影响当前
SqlSession
,不干扰全局配置。
-
Lambda 查询兼容:
- 正常使用
LambdaQueryWrapper
构建查询条件。 - 通过
sqlSession.getMapper()
获取 Mapper 代理执行查询。
- 正常使用
-
超时作用范围:
- 超时设置仅对当前
SqlSession
内的操作生效。 - 会话结束后,配置自动失效,不影响其他请求。
- 超时设置仅对当前
适用场景:
- 需要对特定复杂查询单独设置超时时间。
- 避免全局配置影响其他快速操作。
- 不引入额外拦截器,保持代码轻量。
注意:此方案通过
SqlSession
临时覆盖配置,确保每次需要自定义超时的手动管理会话。如需更细粒度控制(如单个语句超时),可进一步通过 MyBatis 原生@Options
注解实现(需自定义 Mapper 方法)。