java - Spring Data Mongo @Indexed 多次创建索引

标签 java spring mongodb spring-boot spring-data-jpa

我在类级别使用 Spring Data Mongo 的 @Indexed 注释,后跟 @Document

我从日志中注意到,每次建立与 Mongo DB 的连接时,都会执行索引的创建。

这是正常行为吗?不会造成数据库过载吗?

请让我了解 @Indexed 注释的生命周期,以及是否有任何方法可以忽略索引创建(如果已创建)?

我找不到任何相关记录。

最佳答案

使用@Indexed可确保在第一次访问实体时创建声明的索引。 Spring Data MongoDB 的 IndexOperations 调用 createIndex(…)。通常,一旦索引存在且符合给定规范,这就是无操作。通常适用于启动并运行相当长一段时间的应用程序。

AWS Lambda 会清理不热的实例以释放资源。我不确定当你调用例如 MongoDB 时这会如何影响 MongoDB 性能。 createIndex(…) 每分钟左右。如果您没有看到负面影响,那么事情可能会好起来。

MongoDB 上的索引创建会准备一个独占锁(IX,意图独占锁)并在索引创建期间升级该锁。如果有足够多的进程尝试调用 createIndex(…),这可能会产生影响。

有哪些替代方案?

  • 保留持久服务实例(这在某种程度上与 AWS Lambda 相矛盾)
  • 完全删除 @Indexed 并将索引创建移至带外进程(在外部创建索引)
  • 删除@Indexed并以编程方式创建索引(这是推荐的方法,可为您提供最大的灵 active 。您可以检查所需的索引是否已存在并跳过索引创建)。

另请参阅:

关于java - Spring Data Mongo @Indexed 多次创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54109916/

相关文章:

java - 找不到符号符号: method location: class

java - Libvirt Java 绑定(bind)定义域

java - 通过 Gmail API 发送带有纯文本回退的 HTML 电子邮件

java - Spring Data的跨存储持久化是否支持Do​​cument->JPA或Collections?

java - 随机 - 当 'int y' % 2 == 0 && 'int y' != 2 的幂时,nextInt(int y) 无法连续给我 18 个偶数整数

java - 带有拉丁字符的阅读器属性文件

java - 使现有的 Spring Batch 应用程序在多个节点上运行

java - ContextRefreshed 后 Spring WebApp 中 ScheduledFutureTask 中的 RejectedExecutionException

node.js - mongodb schema.createIndex 不是一个函数

linux - 多行复制粘贴到 mongo shell