MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Erreur Tornado :[Errno 24] Trop d'erreur de fichiers ouverts

Très simple, l'objet RequestHandler est instancié pour chaque requête. Ce qui signifie que l'objet mis en cache que vous enregistrez se trouve sur l'objet RequestHandler (par exemple, développer).

Si vous deviez ajouter un simple "print 'CREATED!'" à la fonction dbmongo(...), vous verriez qu'il est créé à chaque requête GET.

Ce que vous devez faire est d'attacher le gestionnaire à l'objet de classe, ou à un "global" selon les besoins, bien que le meilleur des cas soit de le mettre sur l'objet Tornado Application.

Simple :

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

La deuxième approche consiste simplement à en faire un global dans votre fichier :

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

Les deux ont le même problème, c'est-à-dire que si vous avez beaucoup de classes qui veulent utiliser la connexion DB, il est plus difficile de la partager. Étant donné que la base de données est une entité partagée, vous en voudrez probablement une pour l'ensemble de votre application.

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