插入大量数据至MongoDB数据库的速度问题分析

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 插入大量数据至MongoDB数据库的速度问题分析

需求背景:某定时任务产生千条或更多JSON数据,本次数据还未完全写入数据库中,下一次定时任务的数据已经产生,由此而产生的数据拥堵怎么解决?


最初使用SpringBoot对MongoDB数据库做数据插入操作时,使用的是MongoTemplate中的save方法完成数据存储操作。


具体代码实现如下:

JSONArray为我从定时任务中获取到的数据。
for (int i = 0;i < jsonArray.size();i++){
    mongoTemplate.save(jsonArray.get(i),"存储的库名");
}


此种方式存数据太慢,因为是遍历后一个一个存储,效率太低。

可以采用mongoCollection.insertMany()方法,此方法可以批量插入数据,效率很高


具体实现代码如下:

//首先,创建一个MongoDB连接数据库的工具类。
//此类使用的是无密码连接数据库的方法,如果你的数据库有密码,请参照文章末尾的代码。那个代码是使用用户名、密码连接数据库的方法,代码摘自菜鸟教程,亲测有效。
public class MongoDBJDBC {
   static  String MONGO_IP = "数据库IP地址";
   static  Integer MONGO_PORT = 数据库端口号,默认为27017;
   public static MongoCollection getMongoDatabase(String databaseName,String collectionName){
       MongoCollection mongoCollection = null;
       try {
           MongoClient mongoClient = new MongoClient(MONGO_IP,MONGO_PORT);
           MongoDatabase mongoDatabase = mongoClient.getDatabase(databaseName);
           mongoCollection = mongoDatabase.getCollection(collectionName);
       }catch (Exception e){
           System.out.println(e.getClass().getName()+":"+e.getMessage());
       }
       return mongoCollection;
   }
}
获取到MongoCollection对象之后,使用其insertMany方法,插入一个集合。
public void insertData(){
//先使用remove方法,对某数据做删除,再做插入操作,以此实现批量数据的更新功能。
       Query query = new Query(Criteria.where("busi_type").      
                   is(TransformTime.getStringDate()));
       mongoTemplate.remove(query,"数据库中的集合名");    
       List<Document> list = //获取到需要插入到数据库中的方法。
//使用工具类,获取到指定数据库的MongoCollection对象
       MongoCollection mongoCollection = MongoDBJDBC.getMongoDatabase("数据库名","数据库集合名");
       mongoCollection.insertMany(list);
   }


MongoDB数据库有用户名、密码时,连接数据库的方法示例

import java.util.ArrayList;  
import java.util.List;  
import com.mongodb.MongoClient;  
import com.mongodb.MongoCredential;  
import com.mongodb.ServerAddress;  
import com.mongodb.client.MongoDatabase;  
public class MongoDBJDBC {  
   public static void main(String[] args){  
       try {  
           //连接到MongoDB服务 如果是远程连接可以替换“localhost”为服务器所在IP地址  
           //ServerAddress()两个参数分别为 服务器地址 和 端口  
           ServerAddress serverAddress = new ServerAddress("localhost",27017);  
           List<ServerAddress> addrs = new ArrayList<ServerAddress>();  
           addrs.add(serverAddress);  
           //MongoCredential.createScramSha1Credential()三个参数分别为 用户名 数据库名称 密码  
           MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray());  
           List<MongoCredential> credentials = new ArrayList<MongoCredential>();  
           credentials.add(credential);  
           //通过连接认证获取MongoDB连接  
           MongoClient mongoClient = new MongoClient(addrs,credentials);  
           //连接到数据库  
           MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName");  
           System.out.println("Connect to database successfully");  
       } catch (Exception e) {  
           System.err.println( e.getClass().getName() + ": " + e.getMessage() );  
       }  
   }  
}


本文系投稿作品,点击阅读原文即可阅读原作者的博客,欢迎大家投稿!

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
25天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
27天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
91 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
24天前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。
|
1月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
2月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。
|
2月前
|
人工智能 Cloud Native 容灾
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
云数据库“再进化”,OB Cloud如何打造云时代的数据底座?
|
16天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
29 1
|
18天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
31 4
|
25天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
133 1
|
27天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
82 2
下一篇
无影云桌面