sql >> Databasteknik >  >> NoSQL >> MongoDB

Tornado-fel:[Errnr 24] Fel för många öppna filer

Mycket enkelt, RequestHandler-objektet instansieras för varje begäran. Vilket betyder att det cachade objektet som du sparar finns på RequestHandler-objektet (t.ex. expandera).

Om du skulle lägga till en enkel "skriv ut 'SKAPAD!'" till dbmongo(...)-funktionen skulle du se att den skapas vid varje GET-förfrågan.

Vad du behöver göra är att koppla hanteraren till klassobjektet, eller en "global" efter behov, men det bästa fallet är att placera den på Tornado Application-objektet.

Enkelt:

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

Det andra tillvägagångssättet är bara att göra det till ett globalt i din fil:

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

Båda dessa har samma problem som är att om du har många klasser som vill använda DB-anslutningen är det svårare att dela den. Eftersom DB är en delad enhet vill du förmodligen ha en för hela din applikation.

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



  1. Redis typad klient

  2. Tornado-fel:[Errnr 24] Fel för många öppna filer

  3. Mongoose, uppdatera värden i array av objekt

  4. Snabbaste sättet att lagra en numpy array i redis