Connection-Verhalten von django?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

Hallo zusammen,

ich entwickle ein größeres Webapp mit django und habe eine kleine Frage bzgl. des Verbindungsverhaltens von django zur Datenbank.
Ist es richtig, dass django sich pro Anfrage jedes mal aufs neue mit der Datenbank verbindet, also das ganze Gedöns mit "Benutzername -> Passwort usw." und nicht die Verbindung offen hält?

Wenn dem so ist, würde ein Connection Pool sicher ein klein wenig Performance bringen (verwende PostgreSQL).


Vielen Dank für eure Antwort.

Freundliche Grüße
Zuletzt geändert von metty am Sonntag 26. April 2009, 20:45, insgesamt 2-mal geändert.
lunar

Ein intelligentes Framework hält einen eigenen Pool vor, ich denke Django macht da keine Ausnahme. Da es dem Server freisteht, existierende Prozesse zu benutzen, oder das Framework in einem einzigen, nebenläufigen Prozesse lebt, kann das Framework durchaus Verbindungen mehrfach nutzen.

Der Aufbau der Datenbank ist aber meist nicht das Teuerste an einem Datenbankzugriff, daher sollte man ganz generell die Anzahl der nötigen Abfragen möglichst gering halten.
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

lunar hat geschrieben:Ein intelligentes Framework hält einen eigenen Pool vor, ich denke Django macht da keine Ausnahme. Da es dem Server freisteht, existierende Prozesse zu benutzen, oder das Framework in einem einzigen, nebenläufigen Prozesse lebt, kann das Framework durchaus Verbindungen mehrfach nutzen.
Auf der django-Website habe ich nichts derartiges gefunden, also das django selbst einen Pool verwaltet oder vorhält. Wie hier im Forum anderweitig schon festgestellt wurde, läuft django nicht ständig, bzw. es ist nicht definiert was nach der Ausführung von django passiert.
lunar hat geschrieben: Der Aufbau der Datenbank ist aber meist nicht das Teuerste an einem Datenbankzugriff, daher sollte man ganz generell die Anzahl der nötigen Abfragen möglichst gering halten.
Natürlich ist es nicht das schlimmste für eine Datenbank eine Verbindung zu authentifizieren, aber lt. pg_bench sind es auf meinem kleinen Testsystem dennoch ca. 5 - 10 Queries pro Sekunde mehr, die ausgeführt werden können, wenn nicht immer eine Verbindung authentifiziert werden muss. Bei 60 queries/s und vielen parallelen Nutzern machen 10 Queries mehr schon etwas aus. Aber natürlich ist es der sinnvollste Ansatz, unnötige Verbindungen bzw. Querys zu vermeiden. :D
Zuletzt geändert von metty am Sonntag 26. April 2009, 20:41, insgesamt 1-mal geändert.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

metty hat geschrieben:
lunar hat geschrieben:Ein intelligentes Framework hält einen eigenen Pool vor, ich denke Django macht da keine Ausnahme. Da es dem Server freisteht, existierende Prozesse zu benutzen, oder das Framework in einem einzigen, nebenläufigen Prozesse lebt, kann das Framework durchaus Verbindungen mehrfach nutzen.
Auf der django-Website habe ich nichts derartiges gefunden, also das django selbst einen Pool verwaltet oder vorhält. Wie hier im Forum anderweitig schon festgestellt wurde, läuft django nicht ständig, bzw. es ist nicht definiert was nach der Ausführung von django passiert.
Es mag zwar nicht definiert sein, aber solange du nicht CGI verwendest läuft der Prozess dauerhaft.
metty
User
Beiträge: 99
Registriert: Samstag 13. Dezember 2008, 19:30

apollo13 hat geschrieben: Es mag zwar nicht definiert sein, aber solange du nicht CGI verwendest läuft der Prozess dauerhaft.
Das stimmt...
Aber vielleicht "idle't" er vor sich hin oder hält wirklich die Verbindungen vor. :D
Und da ich das nicht weiß --> Genau der Grund meiner Frage. 8)
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Das exakte Verhalten wird wohl von Db-Einstellungen etc… abhängen, außerdem hat jede vernünftige Db einen Query Logger der dir anzeigt wie viele Connections gerade idlen etc, somit siehst du das Verhalten recht schnell…
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich würde sagen, die Frage ist ein typischer Fall von "use the source (Luke)".

Schaut man sich django/db/__init__.py an, sieht man, dass dort eine globale Variable `connection` mit einem DatabaseWrapper initialisiert wird. Dort wie je nach Backend eine passende Implementierung eingebunden, deren Postgres-Variante dies macht:

Code: Alles auswählen

    def _cursor(self):
        if self.connection is None:
            ...
            self.connection = Database.connect(conn_string, **settings_dict['DATABASE_OPTIONS'])
            self.connection.set_isolation_level(1) # make transactions transparent to all cursors
            ...
Solange der das Modul django.db geladen ist und nicht `close()` aufgerufen wird, bleibt auch diese Connection offen. Das `close()` wird aus `close_connection()` aufgerufen und das wird über ein Signal automatisch beim Beenden eines Signals aufgerufen.

Ergo: Die Verbindung immer (Datenbank-unabhängig) wird automatisch am Ende eines Requests abgebaut und beim nächsten Request, der eine Datenbank-Verbindung braucht, wieder aufgebaut.

Nix Connection-Pool.

Vielleicht hilft dies oder dies. Mir scheint, ein GSoC-Student soll an dem Thema arbeiten.

Stefan
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

sma hat geschrieben:Mir scheint, ein GSoC-Student soll an dem Thema arbeiten.
Wenn du Alex meinst; der arbeitet an MultiDb.
Antworten