Was ist ein Cursor in MongoDB?

Wir sind beunruhigt durch eventuell auftretende cursor not found exceptions für einige Morphia Abfragen asList und ich habe ein Hinweis auf SO, dass dies vielleicht ganz Recht sein, Speicher kräftezehrend ist.

Nun würde ich gerne wissen, ein wenig mehr über den hintergrund: kann sombody erklären (in Englisch), welche einen Cursor (in MongoDB) eigentlich ist? Warum kann er offen gelassen oder nicht gefunden werden?


In der Dokumentation definiert einen cursor als:

Einen Zeiger auf die Ergebnismenge einer Abfrage. Kunden können Durchlaufen eines Cursors, abrufen von Ergebnissen. Standardmäßig Cursor timeout nach 10 Minuten Inaktivität

Aber das ist nicht sehr aufschlussreich. Vielleicht könnte es hilfreich sein, zu definieren, eine batch für Abfrage-Ergebnisse, da die Dokumentation auch Staaten:

Den MongoDB-server gibt die Ergebnisse der Abfrage in den Reihen. Batch-Größe wird nicht mehr als die maximale BSON-Dokument Größe. Für die meisten Abfragen, die erste Partie gibt 101 Dokumente oder einfach nur genug Dokumente, um mehr als 1 megabyte. Nachfolgende batch-Größe von 4 Megabyte. [...] Für Abfragen, die eine Art operation ohne index, den server laden muss, werden alle Dokumente im Speicher zum durchführen des sortiervorgangs vor etwaiger Rücksendung der Ergebnisse.

Hinweis: in unserem Abfragen in Frage, die wir nicht verwenden, Sortieren von Aussagen, aber auch keine limit und offset.

  • Ich meine, dass deine Frage wandert das Thema ab, sollten Sie sich Fragen, über. Wenn Sie tatsächlich empfangen "cursor wurde nicht gefunden" Ausnahmen, dann Frage bei Fehler Ihres implementierten code. Eine breitere Diskussion darüber, was ein cursor "eigentlich" ist mehr eine "breitere design-Frage" als etwas, das löst eine spezifische Programmierung problem, wie das, was diese Seite ist, Also "zu viel schimpfen über Cursor, und nicht genug code, der könnte das Problem verursachen". So wie es da steht, deine Frage sieht aus wie es ist zu Fragen, für eine these, die erklären, was ein cursor ist. Nur zeigen einige code.
  • Der Punkt ist, dass das auftreten dieser Ausnahmen hängt von der Umgebung ab. Wir derzeit nicht wissen, welcher parameter (Speicher, CPU, whatever) ist entscheidend. Deshalb bin ich daran interessiert, einige hintergrund. Unser code sieht wie ds.find(Translation.class).asList() (ds Morphia.Datastrore).
  • Wenn Sie mongo in einer Replik setzen Sie den cursor, wird verloren sein, wenn Ihre Server entscheidet, auf einer anderen primären Knoten.
  • Sie sind so wahr. Sie brauchen eine seed list von Servern, verwenden Sie niemals Ihr eigenes load-balancing-Lösung. Beschreibung hier.
InformationsquelleAutor BairDev | 2016-04-21
Schreibe einen Kommentar