MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Erro de tornado:[Errno 24] Erro de muitos arquivos abertos


Muito simples, o objeto RequestHandler é instanciado para cada solicitação. O que significa que o objeto em cache que você está salvando está no objeto RequestHandler (por exemplo, expandir).

Se você adicionar um simples "print 'CREATED!'" à função dbmongo(...), você verá que ele é criado em cada solicitação GET.

O que você precisa fazer é anexar o manipulador ao objeto de classe, ou um "global" conforme necessário, embora o melhor caso seja colocá-lo no objeto Aplicativo Tornado.

Simples:
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

A segunda abordagem é apenas torná-lo global em seu arquivo:
dbmongo_connection = None
def dbmongo():
    if not dbmongo_connection:
        dbmongo_connection = apymongo.Connection("127.0.0.1", 27017)
    return dbmongo_connection

Ambos têm o mesmo problema, que é que, se você tiver muitas classes que desejam usar a conexão do banco de dados, é mais difícil compartilhá-la. Como o banco de dados é uma entidade compartilhada, você provavelmente deseja um para todo o seu aplicativo.
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()