Spring Boot 实战 MongoDB 实现批量写入_mongo 批量保存-程序员宅基地

技术标签: spring boot  MongoDB  数据库  mongodb  

目录

一、概述    

二、开始

三、应用程序类

四、配置类

五、文档类

六、存储库类

七、结论


一、概述    

      Spring数据框架在应用程序中被广泛使用,因为它使访问不同类型的持久性存储变得更容易。这篇文章将展示如何使用SpringDataMongoDB以实现批量插入。
BulkOperations是一个包含要应用于数据库的写入操作列表的接口。它们可以是InsertOne、updateOne updateMany、replaceOne deleteOne deleteMany的任意组合
bulkOperation可以是有序的,也可以是无序的。有序操作将按顺序应用,如果检测到错误,将返回错误代码。无序操作将并行应用,因此可能更快,但应用程序有责任检查操作过程中是否存在错误。有关更多信息,请参阅MongoDB文档的批量写入操作部分。

1、 兼容性表

下面的兼容性表总结了Spring Data版本与MongoDB驱动/数据库版本的关系。

二、开始

POM 文件将指定应用程序将使用的 Spring 数据版本。必须注意使用使用兼容版本的MongoDB Java驱动程序的Spring Data版本。

<dependencies>
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-data-mongodb</artifactId>
       <version>2.7.2</version>
   </dependency>

三、应用程序类

顶级类是一个SpringBootApplication,它实现了CommandLineRunner,如下所示:

@SpringBootApplication
public class SpringDataBulkInsertApplication implements CommandLineRunner {

   @Value("${documentCount}")
   private int count;
   private static final Logger LOG = LoggerFactory
           .getLogger(SpringDataBulkInsertApplication.class);

   @Autowired
   private CustomProductsRepository repository;

   public static void main(String[] args) {
       SpringApplication.run(SpringDataBulkInsertApplication.class, args);
   }


   @Override
   public void run(String... args) {

       repository.bulkInsertProducts(count);
       LOG.info("End run");
   }
}

现在我们需要编写一些类来实现我们的批量插入应用程序。

四、配置类

我们将实现一个类,该类保存 Spring 数据框架将使用的 MongoClient 对象的配置。
注释 将允许我们检索值以配置对MongoDB环境的访问。
@Configuration
public class MongoConfig   {
   @Value("${mongodb.uri}")
   private String uri;

   @Value("${mongodb.database}")
   private String databaseName;

   @Value("${truststore.path}")
   private String trustStorePath;
   @Value("${truststore.pwd}")
   private String trustStorePwd;

   @Value("${mongodb.atlas}")
   private boolean atlas;

   @Bean
   public MongoClient mongo() {
       ConnectionString connectionString = new ConnectionString(uri);
           MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
                   .applyConnectionString(connectionString)
                   .applyToSslSettings(builder -> {
                       if (!atlas) {
                           // Use SSLContext if a trustStore has been provided
                           if (!trustStorePath.isEmpty()) {
                               SSLFactory sslFactory = SSLFactory.builder()
                                       .withTrustMaterial(Paths.get(trustStorePath), trustStorePwd.toCharArray())
                                       .build();
                               SSLContext sslContext = sslFactory.getSslContext();
                               builder.context(sslContext);
                               builder.invalidHostNameAllowed(true);
                           }
                       }
                       builder.enabled(true);
                   })
                   .build();
       return MongoClients.create(mongoClientSettings);
   }

   @Bean
   public MongoTemplate mongoTemplate() throws Exception {
       return new MongoTemplate(mongo(), databaseName);
   }
}

在这个实现中,我们使用一个标志mongodb.atlas来指示这个应用程序将连接到atlas。如果标志为false,则可以使用trustStore创建SSL上下文。这以trustStore.path指向的信任库文件的形式为根证书颁发机构提供证书,在创建时受密码(trustStore.pwd)保护。如果需要,客户端还可以提供密钥库文件,但这并没有实现。
参数mongodb.uri应该包含一个有效的mongodb uri。URI包含客户端连接的主机、用户凭据等。

五、文档类

MongoDB集合与其包含的文档之间的关系是通过由@Document注释修饰的类实现的。此类定义文档的字段,批注定义集合的名称。

@Document("products")
public class Products {

   private static final Logger LOG = LoggerFactory
           .getLogger(Products.class);
   @Id
   private String id;
   private String name;
   private int qty;
   private double price;
   private Date available;
   private Date  unavailable;
   private String skuId;

需要为每个字段定义设置器和获取器。@Id注释表示我们的默认索引。如果未指定此字段,MongoDB将分配一个唯一的ObjectId值。 

六、批量写入—存储库类

MongoDB驱动支持在一个操作中插入一个文档集合。MongoOperations 接口中的下列方法支持这一功能。

  • insert 方法: 以一个 Collection 作为第一个参数。它们在一次批量写入数据库中插入一个对象的列表。

存储库由两个类实现,一个是接口,另一个是实现接口。存储库类充实了应用程序与数据库的交互。存储库中的一个方法负责批量插入:

@Component
public class CustomProductsRepositoryImpl implements CustomProductsRepository {

   private static final Logger LOG = LoggerFactory
           .getLogger(CustomProductsRepository.class);

   @Autowired
   MongoTemplate mongoTemplate;

   public int bulkInsertProducts(int count) {

       LOG.info("Dropping collection...");
       mongoTemplate.dropCollection(Products.class);
       LOG.info("Dropped!");

       Instant start = Instant.now();
       mongoTemplate.setWriteConcern(WriteConcern.W1.withJournal(true));

       Products [] productList = Products.RandomProducts(count);
       BulkOperations bulkInsertion = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, Products.class);

       for (int i=0; i<productList.length; ++i)
           bulkInsertion.insert(productList[i]);

       BulkWriteResult bulkWriteResult = bulkInsertion.execute();

       LOG.info("Bulk insert of "+bulkWriteResult.getInsertedCount()+" documents completed in "+ Duration.between(start, Instant.now()).toMillis() + " milliseconds");
       return bulkWriteResult.getInsertedCount();
   }
}

七、结论

在这个例子中,我们创建了一个随机的产品列表,然后这些产品被无序地批量插入。我们指定了写问题1,这意味着一旦Primary将操作写入日志,服务器就会确认该操作。
这种写入问题会导致更快的插入,但如果Primary崩溃或发生选举,并且数据尚未复制,则有可能丢失数据。为了避免这种危险,请使用“关注多数”。 

文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群
首发程序员宅基地,创作不易,如果觉得文章不错,可以点赞收藏评论
你的支持和鼓励是我创作的动力 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/leesinbad/article/details/131140118

智能推荐

MySQL 语法问题:You can‘t specify target table ‘xxx‘ for update in FROM clause. 原因及解决方法_you can't specify target table 't_bill' for update-程序员宅基地

文章浏览阅读429次。报错信息如下:[Code: 1093, SQL State: HY000] You can’t specify target table ‘bd_bankaccbas’ for update in FROM clause译文:不能在FROM子句中指定目标表‘bd_bankaccbas’进行更新。有问题的SQL语句如下,它在oracle数据库的语法是支持的,但是mysql就不支持直接这么写:from和update都是同一张表。<span style="col..._you can't specify target table 't_bill' for update in from clause

Spring Boot与消息(JMS、AMQP、RabbitMQ)-程序员宅基地

文章浏览阅读421次。为什么80%的码农都做不了架构师?>>> ..._@jmslistener rabitmq

转载:CPU 是如何制造出来的?高清图解_测试版cpu是怎么流出的?-程序员宅基地

文章浏览阅读414次。转载:https://mp.weixin.qq.com/s/VQb_mAFbStQXurtByBa0oQ_测试版cpu是怎么流出的?

【学相伴】Nginx最新教程通俗易懂-狂神说_遇见狂神说 nginx-程序员宅基地

文章浏览阅读1.5w次,点赞91次,收藏384次。Nginx - 学相伴分享人:秦疆(遇见狂神说)公司产品出现瓶颈?我们公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。但是慢慢的,使用我们平台的用户越来越多了,并发量慢慢增大了,这时候一台服务器满足不了我们的需求了。于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。我们希望这个代理服务器可以帮助我们接_遇见狂神说 nginx

分包组包 北斗通信_一种基于北斗的低功耗双向非实时通信方法-程序员宅基地

文章浏览阅读474次。一种基于北斗的低功耗双向非实时通信方法【技术领域】[0001]本发明涉及一种基于北斗的低功耗双向非实时通信方法,属于北斗系统通信技术领域。【背景技术】[0002]北斗卫星系统具备的短报文通信功能在水文、气象、海洋、林业领域的遥测系统已经广泛应用。但鉴于目前北斗通讯终端的功耗较大,发信频度受限的问题,这些遥测系统在应用北斗卫星作为数据传输载体时,一般只实现了野外遥测站向数据采集中心站的单向传输功能,..._北斗双向通信

windows域名映射_windows域名映射文件-程序员宅基地

文章浏览阅读981次,点赞2次,收藏2次。windows域名映射_windows域名映射文件

随便推点

macbook 的 charles 使用-程序员宅基地

文章浏览阅读171次。1 安装在官网下载对应版本, 如果要破解,请找到破解用 charles.jar(charles用java写的),替换掉安装目录中 jar 文件2 取得管理权限下载证书pc移动端证书help -> proxy ssl -> 选择对应的选项,安装好选项,授权永久信任,再输入当前用户密,最后输入 grant 用户权限密码(如果自己的电脑无需)3 使用charles 配置..._macbook charles method connection

2023最新Android Studio安装、卸载、解决c盘占用教程_build configuration language-程序员宅基地

文章浏览阅读7.3k次,点赞30次,收藏133次。2023最新Android Studio安装、卸载、解决c盘占用教程,从安装到hello world运行_build configuration language

【论文精读】Temporally Refined Graph U-Nets for Human Shape and Pose Estimation From Monocular Videos-程序员宅基地

文章浏览阅读245次。摘要:这项工作解决了一个具有挑战性的问题,即从单目视频中估计完整的三维人体形状和姿态。由于现实世界的三维网格标记数据集有限,目前大多数的三维人体形状重建方法只关注单一的RGB图像,丢失了所有的时间信息。与此相反,我们提出了一种临时细化的图形网,包括图像级模块和视频级模块,来解决这一问题。imagelevel模块是用于从图像中进行人体形状和姿态估计的图U-Nets,其中图卷积神经网络(Graph CNN)有助于相邻顶点的信息交流,U-Nets架构扩大了每个顶点的接受域,融合了高层和低层特征。videolev_temporally refined graph u-nets for human shape and pose estimation from mon

ubuntu 安装完oracle之后没有sqlplus,Linux安装Oracle成功后,启动sqlplus问题集合(详解)...-程序员宅基地

文章浏览阅读2.0k次。注意:Oracle安装不能用root用户安装,必须新建用户安装1、 sqlplus命令不识别问题(bash :sqlplus command not found)当你首次安装oracle后,也许会出现这种情况,第一次或许有点棘手,不知道如何改怎么办。这时不用着急,想想Linux里面的命令是如何运行的,如adduser等,我们发现是因为在/bin/文件夹下有这样的一个文件adduser,于是我们也想..._ubuntu中oracle提示sqlpus: command not found

elasticsearch-setup-passwords interactive_bash: elasticsearch-setup-passwords: command not f-程序员宅基地

文章浏览阅读2.6k次。elasticsearch-setup-passwords interactive[root@node-zwf ~]# su elasticsearch[elasticsearch@node-zwf root]$ cd /home/elasticsearch/elasticsearch-7.8.0/[elasticsearch@node-zwf elasticsearch-7.8.0]$ elasticsearch-setup-passwords interactiveba..._bash: elasticsearch-setup-passwords: command not found

学校公共计算机保用规定,湖南中医药大学涉密计算机和涉密移动存储介质保密管理规定...-程序员宅基地

文章浏览阅读922次。第一条为了进一步加强学校涉密计算机和涉密移动存储介质(移动硬盘、U盘、软盘、光盘、存储卡等)的安全保密工作,维护国家安全和利益,维护学校稳定和发展,结合我校工作实际,特制定本规定。第二条学校保密委员会负责全校涉密计算机、移动存储介质保密管理的指导、协调和监督工作。保密技术防范和管理工作由学校网络中心负责。第三条涉密计算机的日常管理制度(一)涉密计算机不得直接或间接接入国际互联网、校园网和其他公共信..._大学 涉密计算机安全保密策略