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

简介: 插入大量数据至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() );  
       }  
   }  
}


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

相关文章
|
8月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
540 158
|
8月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
581 156
|
8月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
691 161
|
8月前
|
数据采集 关系型数据库 MySQL
python爬取数据存入数据库
Python爬虫结合Scrapy与SQLAlchemy,实现高效数据采集并存入MySQL/PostgreSQL/SQLite。通过ORM映射、连接池优化与批量提交,支持百万级数据高速写入,具备良好的可扩展性与稳定性。
|
9月前
|
存储 数据管理 数据库
数据字典是什么?和数据库、数据仓库有什么关系?
在数据处理中,你是否常困惑于字段含义、指标计算或数据来源?数据字典正是解答这些问题的关键工具,它清晰定义数据的名称、类型、来源、计算方式等,服务于开发者、分析师和数据管理者。本文详解数据字典的定义、组成及其与数据库、数据仓库的关系,助你夯实数据基础。
数据字典是什么?和数据库、数据仓库有什么关系?
|
8月前
|
人工智能 Java 关系型数据库
使用数据连接池进行数据库操作
使用数据连接池进行数据库操作
220 11
|
9月前
|
运维 NoSQL 容灾
告别运维噩梦:手把手教你将自建 MongoDB 平滑迁移至云数据库
程序员为何逃离自建MongoDB?扩容困难、运维复杂、高可用性差成痛点。阿里云MongoDB提供分钟级扩容、自动诊断与高可用保障,助力企业高效运维、降本增效,实现数据库“无感运维”。
|
9月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
918 0
|
10月前
|
NoSQL MongoDB 数据库
数据库数据恢复—MongoDB数据库数据恢复案例
MongoDB数据库数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 工作人员在MongoDB服务仍然开启的情况下将MongoDB数据库文件拷贝到其他分区,数据复制完成后将MongoDB数据库原先所在的分区进行了格式化操作。 结果发现拷贝过去的数据无法使用。管理员又将数据拷贝回原始分区,MongoDB服务仍然无法使用,报错“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”

热门文章

最新文章

推荐镜像

更多