业务背景:前端上传zip压缩包文件,后端接受到请求后解压zip得到源文件,数据库记录源文件信息,数据库使用的是mongodb,业务要求同一个文件(这里我们根据文件名称作为判断条件)只有一条记录。

实现方案:

方案一:使用MongoRepository中的saveAll()方法;为减少对数据库的访问,这里都使用的是批量操作,首先根据文件名称批量查询,对结果集中的文件名称和参数文件名集合进行比较,取差集,对结果集中没有的进行批量插入,总结一下就是先查询去重再执行插入。

方案二:在文件名称字段上创建唯一索引,让数据库本身保证数据唯一性;使用唯一所以代码层面使用mongoTemplate.bulkOps,具体如下:
 

    public void saveBatch(List<FileEntity> list) {
        mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED,     FileEntity.class).insert(list).execute();
    }

参数说明:

BulkMode.UNORDERED:表示并行处理,遇到错误时能继续执行不影响其他操作;
BulkMode.ORDERED:表示顺序执行,遇到错误时会停止所有执行

这里推荐使用第二种方案,效率高,实测每批500条数据插入耗时150毫秒左右

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐