技术标签: spring boot MongoDB 数据库 mongodb
目录
Spring数据框架在应用程序中被广泛使用,因为它使访问不同类型的持久性存储变得更容易。这篇文章将展示如何使用SpringDataMongoDB以实现批量插入。
BulkOperations是一个包含要应用于数据库的写入操作列表的接口。它们可以是InsertOne、updateOne updateMany、replaceOne deleteOne deleteMany的任意组合
bulkOperation可以是有序的,也可以是无序的。有序操作将按顺序应用,如果检测到错误,将返回错误代码。无序操作将并行应用,因此可能更快,但应用程序有责任检查操作过程中是否存在错误。有关更多信息,请参阅MongoDB文档的批量写入操作部分。
下面的兼容性表总结了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");
}
}
现在我们需要编写一些类来实现我们的批量插入应用程序。
@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崩溃或发生选举,并且数据尚未复制,则有可能丢失数据。为了避免这种危险,请使用“关注多数”。
文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群
首发程序员宅基地,创作不易,如果觉得文章不错,可以点赞收藏评论
你的支持和鼓励是我创作的动力
文章浏览阅读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
文章浏览阅读421次。为什么80%的码农都做不了架构师?>>> ..._@jmslistener rabitmq
文章浏览阅读414次。转载:https://mp.weixin.qq.com/s/VQb_mAFbStQXurtByBa0oQ_测试版cpu是怎么流出的?
文章浏览阅读1.5w次,点赞91次,收藏384次。Nginx - 学相伴分享人:秦疆(遇见狂神说)公司产品出现瓶颈?我们公司项目刚刚上线的时候,并发量小,用户使用的少,所以在低并发的情况下,一个jar包启动应用就够了,然后内部tomcat返回内容给用户。但是慢慢的,使用我们平台的用户越来越多了,并发量慢慢增大了,这时候一台服务器满足不了我们的需求了。于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。我们希望这个代理服务器可以帮助我们接_遇见狂神说 nginx
文章浏览阅读474次。一种基于北斗的低功耗双向非实时通信方法【技术领域】[0001]本发明涉及一种基于北斗的低功耗双向非实时通信方法,属于北斗系统通信技术领域。【背景技术】[0002]北斗卫星系统具备的短报文通信功能在水文、气象、海洋、林业领域的遥测系统已经广泛应用。但鉴于目前北斗通讯终端的功耗较大,发信频度受限的问题,这些遥测系统在应用北斗卫星作为数据传输载体时,一般只实现了野外遥测站向数据采集中心站的单向传输功能,..._北斗双向通信
文章浏览阅读981次,点赞2次,收藏2次。windows域名映射_windows域名映射文件
文章浏览阅读171次。1 安装在官网下载对应版本, 如果要破解,请找到破解用 charles.jar(charles用java写的),替换掉安装目录中 jar 文件2 取得管理权限下载证书pc移动端证书help -> proxy ssl -> 选择对应的选项,安装好选项,授权永久信任,再输入当前用户密,最后输入 grant 用户权限密码(如果自己的电脑无需)3 使用charles 配置..._macbook charles method connection
文章浏览阅读7.3k次,点赞30次,收藏133次。2023最新Android Studio安装、卸载、解决c盘占用教程,从安装到hello world运行_build configuration language
文章浏览阅读245次。摘要:这项工作解决了一个具有挑战性的问题,即从单目视频中估计完整的三维人体形状和姿态。由于现实世界的三维网格标记数据集有限,目前大多数的三维人体形状重建方法只关注单一的RGB图像,丢失了所有的时间信息。与此相反,我们提出了一种临时细化的图形网,包括图像级模块和视频级模块,来解决这一问题。imagelevel模块是用于从图像中进行人体形状和姿态估计的图U-Nets,其中图卷积神经网络(Graph CNN)有助于相邻顶点的信息交流,U-Nets架构扩大了每个顶点的接受域,融合了高层和低层特征。videolev_temporally refined graph u-nets for human shape and pose estimation from mon
文章浏览阅读2.0k次。注意:Oracle安装不能用root用户安装,必须新建用户安装1、 sqlplus命令不识别问题(bash :sqlplus command not found)当你首次安装oracle后,也许会出现这种情况,第一次或许有点棘手,不知道如何改怎么办。这时不用着急,想想Linux里面的命令是如何运行的,如adduser等,我们发现是因为在/bin/文件夹下有这样的一个文件adduser,于是我们也想..._ubuntu中oracle提示sqlpus: command not found
文章浏览阅读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盘、软盘、光盘、存储卡等)的安全保密工作,维护国家安全和利益,维护学校稳定和发展,结合我校工作实际,特制定本规定。第二条学校保密委员会负责全校涉密计算机、移动存储介质保密管理的指导、协调和监督工作。保密技术防范和管理工作由学校网络中心负责。第三条涉密计算机的日常管理制度(一)涉密计算机不得直接或间接接入国际互联网、校园网和其他公共信..._大学 涉密计算机安全保密策略