Qu'est ce qu'un Curseur dans MongoDB?
Nous sommes troublés par finalement survenant cursor not found exceptions
pour certains Morphia Requêtes asList
et j'ai trouvé un l'allusion sur DONC, que cela pourrait être tout à fait mémoire de consommation.
Maintenant, je voudrais en savoir un peu plus sur le fond: peut sombody expliquer (en anglais), ce qu'un Curseur (MongoDB) est en réalité? Pourquoi ne peut-il maintenu ouvert ou ne pas être trouvé?
La documentation définit un curseur:
Un pointeur vers le résultat d'une requête. Les Clients peuvent parcourir un curseur pour récupérer les résultats. Par défaut, les curseurs de délai d'attente après 10 minutes d'inactivité
Mais ce n'est pas très révélateur. Peut-être il pourrait être utile de définir un batch
pour les résultats de la requête, parce que le documentation indique également:
Le serveur MongoDB renvoie les résultats de la requête dans les lots. La taille des lots ne pourra pas dépasser le maximum BFILS de la taille du document. Pour la plupart des requêtes, le premier lot de retours 101 documents ou juste assez de documents pour dépasser 1 mo. Ultérieure de la taille des lots est de 4 mégaoctets. [...] Pour les requêtes qui comprennent une opération de tri sans index, le serveur doit charger tous les documents dans la mémoire pour effectuer le tri avant de retourner les résultats.
Remarque: dans nos requêtes en question, nous n'utilisons pas de tri à tous les états, mais aussi pas de limit
et offset
.
Le point est, que la présence de ces exceptions dépend de l'environnement. Actuellement, nous ne savons pas de quel paramètre (mémoire, CPU, peu importe) est la clé. Donc je suis intéressé par quelques background. Notre code ressemble à
ds.find(Translation.class).asList()
(ds est un Morphia.Datastrore).Si vous exécutez mongo dans un jeu de réplicas le curseur sera perdu si vos serveurs décide sur un autre nœud principal.
Vous êtes tellement vrai. Vous avez besoin d'un
seed list
de serveurs, de ne jamais utiliser votre propre solution d'équilibrage de charge. Description.OriginalL'auteur BairDev | 2016-04-21
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas non plus un mongodb expert, mais je tiens juste à ajouter quelques observations de travailler dans une de taille moyenne mongo système pour la dernière année. Merci également à @xameeramir pour l'excellent soluce sur comment les curseurs de travail en général.
Les causes d'un "curseur perdu", hormis peut-être plusieurs. Celui que j'ai remarqué, c'est expliqué dans cette réponse.
Le curseur vie côté serveur. Il n'est pas distribué sur un ensemble de répliques, mais il existe sur l'instance principale au moment de la création. Cela signifie que si une autre instance prend la primaire le curseur sera perdu pour le client. Si l'ancien principal est toujours en place et peut encore être là, mais pour aucune utilisation. Je suppose que c'est garbaged recueillies à l'écart après un certain temps. Donc, si votre mongo jeu de réplicas est instable ou si vous avez un fragile réseau en face de lui, vous êtes hors de la chance lors d'un long temps d'exécution des requêtes.
Si le contenu complet de ce que le curseur se veut un retour ne tient pas en mémoire sur le serveur, la requête peut être très lent. RAM sur vos serveurs doit être plus grande que le plus grand requête que vous exécutez.
Tout cela peut en partie être évités par la conception de meilleures. Pour un cas d'utilisation avec de grandes requêtes de longue durée, il peut être préférable de avec plusieurs petites collections de base de données au lieu d'un seul.
OriginalL'auteur froderik
find() et les Curseurs dans la Node.js Pilote
Avis que l'appel
.toArray
est en faisant la demande à récupérer l'intégralité du jeu de données.Blockquote
Avis que le curseur renvoyé par la
find()
est attribué àvar cursor
. Avec cette approche, au lieu de récupérer toutes les données de la memort et de la consommation des données à la fois, nous sommes en streaming les données de notre application.find()
pouvez créer un curseur immédiatement car il n'est pas réellement faire une demande à la base de données jusqu'à ce que nous essayons d'utiliser certains des documents qu'il fournit. Le point decursor
est de décrire notre requête. Le 2e paramètre decursor.forEach
montre comment faire lorsque le conducteur est épuisé ou une erreur se produit.Dans la version initiale du code ci-dessus, il a été
toArray()
qui a forcé la base de données d'appel. Cela signifiait que nous avions besoin TOUS les documents et les voulais dans unearray
.Aussi,
MongoDB
retourne des données dans le lot format. L'image ci-dessous montre, les demandes de curseurs (de la demande) pourMongoDB
forEach
est mieux quetoArray
parce que nous pouvons traiter des documents comme ils viennent dans jusqu'à ce que nous arrivons à la fin. Par contraste avectoArray
- où nous attendons TOUS les documents à récupérer et la ensemble tableau est construit. Cela signifie que nous n'obtenez aucun avantage du fait que le conducteur et le système de base de données travaillent ensemble pour lot de résultats pour votre application. Le dosage est destiné à fournir de l'efficacité en termes de surcharge de la mémoire et le temps d'exécution. En profiter, si vous le pouvez dans votre application.OriginalL'auteur student
Cette erreur vient aussi quand avoir un grand ensemble de données et le traitement par lots des données et de chaque lot prend plus de temps que le curseur par défaut de temps en direct.
Alors vous avez besoin de changer que par défaut le temps de lui dire mongo qui n'expirera pas ce curseur jusqu'à ce que le traitement est terminé.
Faire vérifier Pas De Délai D'Expiration De La Documentation
OriginalL'auteur Sagar Kamble