sql >> Database >  >> NoSQL >> MongoDB

Tornado-fout:[Errno 24] Fout te veel geopende bestanden

Heel eenvoudig, het RequestHandler-object wordt voor elk verzoek geïnstantieerd. Wat betekent dat het in de cache opgeslagen object dat u opslaat zich op het RequestHandler-object (bijvoorbeeld uitvouwen) bevindt.

Als je een simpele "print 'CREATED!'" aan de dbmongo(...)-functie zou toevoegen, zou je zien dat deze bij elk GET-verzoek wordt aangemaakt.

Wat u moet doen, is de handler aan het klasseobject koppelen, of een "algemeen" indien nodig, hoewel u deze het beste op het Tornado Application-object kunt plaatsen.

Simpel:

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

De tweede benadering is om er gewoon een globaal van te maken in je bestand:

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

Beide hebben hetzelfde probleem, namelijk dat als je veel klassen hebt die de DB-verbinding willen gebruiken, het moeilijker is om deze te delen. Aangezien de DB een gedeelde entiteit is, wilt u er waarschijnlijk een voor uw hele applicatie.

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. Hoe kan ik mijn /sidekiq-route met een wachtwoord beveiligen (d.w.z. authenticatie vereisen voor de Sidekiq::Web-tool)?

  2. Hoe sluit je een bepaald veld uit van een verzameling in Mongoose?

  3. Hoe Redis-verbindingen configureren met Rails 4, Puma en Sidekiq?

  4. limieten van het aantal collecties in databases