我在类级别使用 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 。您可以检查所需的索引是否已存在并跳过索引创建)。
另请参阅:
- MongoDB
db.collection.createIndex(…)
关于java - Spring Data Mongo @Indexed 多次创建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54109916/