Spring Data Mongo @Indexed 多次创建索引

Posted

技术标签:

【中文标题】Spring Data Mongo @Indexed 多次创建索引【英文标题】:Spring Data Mongo @Indexed creates index multiple times 【发布时间】:2019-06-04 05:09:39 【问题描述】:

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

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

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

请让我了解@Indexed 注释的生命周期,如果已经创建索引,有什么方法可以忽略它?

我找不到任何为此记录的内容。

【问题讨论】:

logs that each time the connection to Mongo DB is established你的意思是每次启动你的应用程序? @mp911de 是的,我使用的是 AWS Lambda,所以每次调用 Lambda 并建立与 Mongo DB 的连接。 我在类级别使用 Spring Data Mongo 和 Document 的 Indexed annotation。先生,您为什么将@index 放在班级级别?只是想知道这有什么帮助 @NamNguyễn 只有 @Document 用于类级别,@Indexed 用于成员变量。 @Adnan 你能用任何注释来实现它吗?我们遇到了与@Indexed(unique = true) 相同的问题,它试图再次创建索引,即使在数据库索引中已经存在 【参考方案1】:

从 2.2.x 版本开始,您可以使用名为 spring.data.mongodb.autoIndexCreation: true/false 的属性控制在服务器启动时创建索引的行为

【讨论】:

【参考方案2】:

据我所知,无论您做什么,应用程序都会调用命令来创建索引(新的或已经退出)。这个过程有利于应用程序运行并确保一切正常。关于这个命令在 MongoDb 中的作用,让我们进一步了解一下

    Index 有什么作用以及它如何工作 (https://en.wikipedia.org/wiki/Database_index) 排序:复制一份并给它一个顺序(所有有规则的东西都有助于加快搜索速度) 可能是 B-Tree 或其他结构

    createIndex 命令会做什么? https://jira.mongodb.org/browse/SERVER-12699 https://jira.mongodb.org/browse/SERVER-10879 这两个问题说明了这一点,它不会做同样的事情已经退出。 所以逻辑很简单。

应用程序:我想要一些东西(创建索引并确保它会在那里) ~> 我应该调用 CreateIndex

MongoDb:接受命令: - 我看到它是新的:创建它 - 我看到它重复:哦转储操作,我会跳过这个并让你知道。

这是我对这个问题的快速研究

【讨论】:

更多信息在:***.com/questions/1108/…【参考方案3】:

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

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

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

有什么选择?

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

另见:

MongoDB db.collection.createIndex(…)

【讨论】:

好的,谢谢,但这是否意味着,这是 Spring Data Mongo 实现在每次应用程序初始化时创建索引(而不是先检查是否存在)的正常行为? 我也认为在MongoDB中创建索引是幂等操作。所以运行db.names.createIndex(name:1) 只会在索引不存在的情况下创建索引,如果是这种情况,我认为 Spring Data 多次执行它就可以了

以上是关于Spring Data Mongo @Indexed 多次创建索引的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongo 搜索集合并返回子文档列表(Spring-data-mongo)

使用 Spring data mongo 和 Spring data elasticsearch 时如何建模?

使用 mongoTemplate 在 spring-data-mongo Java 中进行 Mongo 聚合查询

spring-data-mongo - 可选查询参数?

spring-data-mongo的MongoTemplate开发

spring data mongo使用小记