springdata mongo分页查询数据时报错:maximum 33554432 bytes of RAM

09-26 16:56:54   来源:shikezhi   评论: 点击:

springdata mongo分页查询数据时报错:com.mongodb.MongoException: Executor error: OperationFailed Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.
springdata mongo分页查询数据时报错:com.mongodb.MongoException: Executor error: OperationFailed Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.
 
 
原因:
    @Override
    public Page<MessageInfo> findMessageInfoByPage(int pageNumber, int pageSize) {
        if(pageNumber<0||pageSize<=0){
            logger.warn("pageNumber:{} or pageSize:{} params is illegal",pageNumber,pageSize);
            return null;
        }
        logger.info("pageNumber:{} or pageSize:{} query",pageNumber,pageSize);
 
        Pageable pageAble = new QPageRequest(pageNumber, pageSize, QBgmMessages.bgmMessages.createdAt.asc());
        Page<BgmMessages> sPage= messagesRepository.findAll(pageAble);
 
        List<BgmMessages> messages= sPage.getContent();
        List<MessageInfo> msgVoList=new ArrayList();
        for(BgmMessages msg:messages){
            msgVoList.add(convertBgmMessagesToMessageInfo(msg));
        }
 
        Page<MessageInfo> page=new Page(msgVoList,Page.getStartOfPage(pageNumber,pageSize),toIntExact(sPage.getTotalElements()),pageSize);
        return page;
    }
 
mongodb中的sort是在内存中排序的,最大允许占用32MB内存 (32MB in-memory sort limit),超过这个数字就会报错,解决办法是给排序字段建索引,或者修改Sort最大内存限制
 
建索引方法请参考:
https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/
 
修改Sort最大内存限制方法:
db.adminCommand({"setParameter": 1, "internalQueryExecMaxBlockingSortBytes" : 134217728})   //将sort默认内存限制修改为128M
 
 
 
 
我这里由于mongo所在的环境是生产环境,所以上面提到的两种方法都没有用。而且查询的结果是否排序不是很重要。所以采集的措施是直接把排序的代码去掉(删除代码:QBgmMessages.bgmMessages.createdAt.asc()),内容如下:
    @Override
    public Page<MessageInfo> findMessageInfoByPage(int pageNumber, int pageSize) {
        if(pageNumber<0||pageSize<=0){
            logger.warn("pageNumber:{} or pageSize:{} params is illegal",pageNumber,pageSize);
            return null;
        }
        logger.info("pageNumber:{} or pageSize:{} query",pageNumber,pageSize);
 
        Pageable pageAble = new QPageRequest(pageNumber, pageSize);
        Page<BgmMessages> sPage= messagesRepository.findAll(pageAble);
 
        List<BgmMessages> messages= sPage.getContent();
        List<MessageInfo> msgVoList=new ArrayList();
        for(BgmMessages msg:messages){
            msgVoList.add(convertBgmMessagesToMessageInfo(msg));
        }
 
        Page<MessageInfo> page=new Page(msgVoList,Page.getStartOfPage(pageNumber,pageSize),toIntExact(sPage.getTotalElements()),pageSize);
        return page;
    }
 

相关热词搜索:mongo springdata

上一篇:MongoDB安装图文教程 下一篇:最后一页
分享到: 收藏