MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Errore Tornado:[Errno 24] Errore di troppi file aperti

Molto semplice, l'oggetto RequestHandler viene istanziato per ogni richiesta. Ciò significa che l'oggetto memorizzato nella cache che stai salvando si trova sull'oggetto RequestHandler (ad es. Espandi).

Se dovessi aggiungere un semplice "print 'CREATED!'" alla funzione dbmongo(...) vedresti che viene creato su ogni richiesta GET.

Quello che devi fare è collegare il gestore all'oggetto classe, o un "globale" secondo necessità, anche se il caso migliore è inserirlo nell'oggetto Tornado Application.

Semplice:

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

Il secondo approccio è solo quello di renderlo globale nel tuo file:

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

Entrambi hanno lo stesso problema che è che se hai molte classi che vogliono usare la connessione DB, è più difficile condividerla. Poiché il DB è un'entità condivisa, probabilmente ne vuoi uno per l'intera applicazione.

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()