2015-01-28 7 views
5

tötet Wenn der Lesevorgang eine Weile dauert, wird der Cursor beim Abfragen einer MongoDB-Sammlung ablaufen. Es gibt eine timeout=False Option, die den Cursor nicht zeitüberwacht, und dann muss es manuell geschlossen werden.Wie man tote Cursor in MongoDB

Wenn ein Skript mit einem geöffneten Cursor abstürzt, bleibt dieser Cursor vermutlich bis zum nächsten Neustart in der Datenbank aktiv. Im MMS-Monitoring-Dashboard sind diese im Diagramm "Cursor" als hohe Konstante sichtbar.

mms cursors

Was sind die Folgen davon? Und wie kann ich diese Cursor manuell töten?

+1

Verwenden Sie die ['close' Methode] (http://api.mongodb.org/python/current/api/pymongo/cursor.html#pymongo.cursor.Cursor.close) des Cursor-Objekts. Die Kosten für offene Cursor sind der Speicher, der auf dem Server für den Cursor benötigt wird. Es ist minimal, kann aber zu einem Problem werden, wenn die Anzahl der offenen Cursor zu Hunderten oder Tausenden zunimmt. Der Cursor wird auch automatisch geschlossen, wenn das Cursorobjekt von Python gesammelt wird. – wdberkeley

+0

Danke für Ihre Antwort! Was ist, wenn mein Skript abgestorben ist und Python die Cursor nicht aktiviert und geschlossen hat? Ich habe mich gefragt, ob es einen Weg gibt, sie zu finden und zu schließen. – user831885

+2

Nicht so weit ich weiß. Dies wäre mit der in [SERVER-3090] (https://jira.mongodb.org/browse/SERVER-3090) angeforderten Funktion möglich, aber das wurde noch nicht implementiert. Natürlich sollten Sie unsterbliche Cursor vermeiden. Sie können das Zeitlimit als groß, aber endlich festlegen, oder Sie können eine Sortierung für den Cursor verwenden und den Cursor aus dem zuletzt gesehenen Element wieder öffnen, wenn er nach einem Zeitraum der Inaktivität geschlossen wird. – wdberkeley

Antwort