MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Tornado-Fehler:[Errno 24] Zu viele offene Dateien Fehler

Ganz einfach, das RequestHandler-Objekt wird für jede Anfrage instanziiert. Das bedeutet, dass sich das zwischengespeicherte Objekt, das Sie speichern, im RequestHandler-Objekt (z. B. expand) befindet.

Wenn Sie der dbmongo(...)-Funktion ein einfaches "print 'CREATED!'" hinzufügen würden, würden Sie sehen, dass es bei jeder GET-Anforderung erstellt wird.

Was Sie tun müssen, ist, den Handler an das Klassenobjekt oder an ein "globales" Objekt anzuhängen, obwohl es am besten ist, es auf das Tornado-Anwendungsobjekt zu legen.

Ganz einfach:

class setup(tornado.web.RequestHandler):
    @classmethod
    def dbmongo(cls):
        if not hasattr(cls, '_dbmongo'):
            cls._dbmongo = apymongo.Connection("127.0.0.1", 27017)
        return cls._dbmongo

Der zweite Ansatz besteht darin, es einfach in Ihrer Datei global zu machen:

dbmongo_connection = None
def dbmongo():
    if not dbmongo_connection:
        dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
    return dbmongo_connection

Beide haben das gleiche Problem:Wenn Sie viele Klassen haben, die die DB-Verbindung verwenden möchten, ist es schwieriger, sie gemeinsam zu nutzen. Da die DB eine gemeinsam genutzte Entität ist, möchten Sie wahrscheinlich eine für Ihre gesamte Anwendung.

class MongoMixin(object):
    def mongodb(self):
        if not hasattr(self.application, 'mongodb'):
            self.application.mongodb = apymongo.Connection(self.application.settings.get("mongohost", "127.0.0.1"), 27017)
        return self.application.mongodb

class expand(tornado.web.RequestHandler, MongoMixin):
    def get(self):
       db = self.mongodb()