3
votes

Spring Data Mongo @Indexed crée un index plusieurs fois

J'utilise l'annotation @Indexed à l'aide de Spring Data Mongo suivie de @Document au niveau de la classe.

Je remarque dans les journaux que chaque fois que la connexion à Mongo DB est établie, une création de l'index est effectuée.

Ce comportement est-il normal et ne créera-t-il pas une surcharge sur la base de données?

Veuillez me faire comprendre le cycle de vie de l'annotation @Indexed et est-il possible d'ignorer la création d'index si elle est déjà créée?

Je ne trouve rien de documenté à ce sujet.


4 commentaires

enregistre que chaque fois que la connexion à Mongo DB est établie Voulez-vous dire à chaque fois que vous démarrez votre application?


@ mp911de Oui, j'utilise AWS Lambda, donc chaque fois qu'un Lambda est appelé et qu'une connexion est établie avec Mongo DB.


J'utilise l'annotation indexée à l'aide de Spring Data Mongo suivi de Document au niveau de la classe. Monsieur, pourquoi mettez-vous @index au niveau de la classe? Je me demande simplement comment cela peut-il aider


@ NamNguyễn Seul @Document est utilisé au niveau de la classe et @Indexed pour les variables membres.


3 Réponses :


3
votes

L'utilisation de @Indexed garantit lors du premier accès à une entité que les index déclarés sont créés. Les IndexOperations de Spring Data MongoDB appellent createIndex (…) . En règle générale, il s'agit d'un no-op une fois que l'index existe avec la spécification donnée. S'applique généralement aux applications qui démarrent et s'exécutent pendant un certain temps.

AWS Lambda nettoie plutôt les instances qui ne sont pas chaudes pour libérer des ressources. Je ne sais pas comment cela affecte les performances de MongoDB lorsque vous appelez par exemple createIndex (…) toutes les minutes environ. Si vous ne voyez pas d'impact négatif, les choses pourraient bien se passer.

La création d'index sur MongoDB prépare un verrou exclusif (IX, intention de verrouiller exclusivement) et augmente ce verrou lors de la création de l'index. Cela peut avoir un impact si des processus suffisants tentent d'appeler createIndex (…) .

Quelles sont les alternatives?

  • Conserver une instance de service persistante (ce qui contredit dans une certaine mesure AWS Lambda)
  • Supprimer complètement @Indexed et déplacer la création d'index vers un processus hors bande (créer les index en externe)
  • Supprimez @Indexed et créez des index par programme (il s'agit de l'approche recommandée vous offrant le plus de flexibilité. Vous pouvez vérifier si les index requis sont déjà présents et ignorer la création d'index).

Voir aussi:


2 commentaires

Ok Merci mais cela signifie-t-il qu'il s'agit d'un comportement normal de Spring Data Mongo Implementation pour créer des index (au lieu de vérifier d'abord s'il existe) à chaque fois que l'application est initialisée?


Je pense aussi que la création d'index dans MongoDB est une opération idempotente. Donc, exécuter db.names.createIndex ({name: 1}) ne créerait l'index que s'il n'existait pas déjà et si c'est le cas, je pense que Spring Data l'exécuter plusieurs fois est très bien



0
votes

Comme je le sais, quoi que vous fassiez, l'application appelle la commande pour créer un index (nouveau ou déjà sorti). Et ce processus est bon pour qu'une application s'exécute et s'assure de tout. À propos de ce que cette commande fait dans MongoDb, vérifions-la plus en détail

  1. Que fait Index et comment cela peut-il fonctionner ( https: //en.wikipedia. org / wiki / Database_index ) Trier: faites une copie et donnez-lui un ordre (tout avec des règles aidera à accélérer la vitesse de recherche) Peut-être s'agit-il d'un B-Tree ou d'une autre structure

  2. Que fera la commande createIndex? https://jira.mongodb.org/browse/SERVER-12699 https://jira.mongodb.org/browse/SERVER-10879 Ces deux questions le montrent clairement, cela ne fera pas la même chose déjà. La logique est donc simple.

Application: je veux quelque chose (créez un index et assurez-vous qu'il sera là) ~> Je devrais appeler le CreateIndex

MongoDb: Prenez la commande: - Je vois que c'est nouveau: créez-le - Je le vois en double: Oh action de vidage, je vais sauter ceci et vous le faire savoir.

C'est ma recherche rapide sur ce problème


1 commentaires

1
votes

à partir de la version 2.2.x, vous pouvez contrôler le comportement de la création d'index au démarrage du serveur en utilisant la propriété appelée - spring.data.mongodb.autoIndexCreation: true / false


0 commentaires