Spring Data Mongo @Indexed多次创建索引

时间:2019-01-09 12:14:06

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

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

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

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

请让我理解@Indexed批注的生命周期,是否可以忽略索引创建(如果已创建)?

我找不到与此相关的任何文档。

3 个答案:

答案 0 :(得分:1)

使用@Indexed可确保在首次访问创建声明索引的实体时使用。 Spring Data MongoDB的IndexOperations调用createIndex(…)。通常,一旦索引存在于给定的规范中,则此操作为空。通常适用于启动并运行很长时间的应用程序。

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

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

有哪些替代方案?

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

另请参阅:

答案 1 :(得分:1)

从2.2.x版开始,您可以使用名为-spring.data.mongodb.autoIndexCreation:true / false

的属性来控制服务器启动时创建索引的行为。

答案 2 :(得分:0)

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

  1. 索引的作用以及如何工作(https://en.wikipedia.org/wiki/Database_index) 排序:制作一份副本并发出命令(使用规则的所有内容都将有助于加快搜索速度) 可能是B树或其他结构

  2. createIndex命令将做什么? https://jira.mongodb.org/browse/SERVER-12699 https://jira.mongodb.org/browse/SERVER-10879 这两个问题使这一点很清楚,它不会做已经退出的同一件事。 因此逻辑很简单。

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

MongoDb:使用命令: -我看到它是新的:创建它 -我看到它重复了:哦,转储操作,我将跳过此操作并通知您。

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