Seite 1 von 1

Python und MySQL Datenbank

Verfasst: Samstag 24. Februar 2007, 12:39
von Miko
Hi,
Ich habe ein kleines Script was eine verbindung öffnet, befehl ausführt, die verbindung mit c.close() wieder schließt, 2 sekunden wartet und das ganze wieder von vorne macht.

Das Problem ist das Mysql ein haufen Prozesse öffnet und die im Sleep Modus offen lässt. das Frist arbeitsspeicher in massen. Ich hab interactive timeout und wait timeout schon auf 1000 runtergestellt in der my.cnf was mir auch durch phpmyadmin bestätigt worden ist. allerdings bleiben die prozesse häufig trotzdem noch länger offen.

Wie kann ich die verbindung wirklich komplett im script eleminieren?
oder gibt es eine möglichkeit die prozesse die länger laufen mit hilfe eines python scriptes zu killen?

teilweise verbraucht der mysql server über 250 mb wenn das script läuft.

Ich weis nicht wie ich das ändern kann.

Verfasst: Samstag 24. Februar 2007, 13:01
von BlackJack
Musst Du denn immer wieder Verbindungen aufbauen und wieder schliessen? Das ist generell eine relativ teure Operation. Wenn möglich solltest Du die Verbindung nicht wieder Trennen sondern wiederverwenden.

Verfasst: Samstag 24. Februar 2007, 13:19
von Miko
dann nimmt er nicht die geupdateten tables her sondern immer die gleichen alten.
wenn ich nicht jedesmal
verbindung=...
c=verbindung.cursor()

mache dann nimmt er immer die alten tabellen vom letzten mal verbindung=...

aber darum gehts ja jetzt eigentlich auch nicht

Verfasst: Samstag 24. Februar 2007, 14:23
von BlackJack
Kann es sein dass Du einfach irgendwo ein `commit()` vergessen hast?

Verfasst: Samstag 24. Februar 2007, 16:47
von Miko
ich hab immer c.execute("commit")
mach ich überall außer bei selects

Verfasst: Samstag 24. Februar 2007, 17:22
von PmanX

Code: Alles auswählen

# server_version.py - retrieve and display database server version

import MySQLdb

conn = MySQLdb.connect (host = "localhost",
                           user = "testuser",
                           passwd = "testpass",
                           db = "test")
cursor = conn.cursor ()
cursor.execute ("SELECT VERSION()")
row = cursor.fetchone ()
print "server version:", row[0]
cursor.close ()
conn.close ()
Nur mal schnell von http://www.kitebird.com/articles/pydbapi.html kopiert.
Ohne Beispielcode und Konfiguration müssen wir raten.

Gruß P.

Verfasst: Samstag 24. Februar 2007, 17:45
von jens
Miko hat geschrieben:ich hab immer c.execute("commit")
Dafür gibt es von der DB-API vorgefertige Methoden. IMHO: c.commit() und c.rollback()...

Siehe auch: [wiki]DB Transaktionen[/wiki]

Verfasst: Samstag 24. Februar 2007, 18:41
von PmanX
Sind Transaktionen jetzt Standard?

Über welche Version reden wir?

Verfasst: Samstag 24. Februar 2007, 19:45
von birkenfeld
Connection.commit() ist im DB-API 2.0 spezifiziert, ja.

http://www.python.org/dev/peps/pep-0249/

Verfasst: Samstag 24. Februar 2007, 20:10
von Miko
hi,
ist es nicht egal ob c.execute("commit")
oder c.commit()

ich hab nie connection.close() gemacht immer nur c.close()
vielleicht lags daran.

warum macht man 2 mal die verbindung auf:

Code: Alles auswählen

verbindung= ....
c=verbindung.cursor()
und wieder 2 mal zu?

Code: Alles auswählen

c.close()
verbindung.close()
schöne grüße
Miko

edit:
muss ich auch bei Select ein commit machen?

edit2:
JUHU jetzt schließt er sie immer wieder. DANKE!

Verfasst: Samstag 24. Februar 2007, 21:59
von BlackJack
Du machst nicht zweimal eine Verbindung auf, sondern nur einmal und in der Verbindung dann einen Cursor. Man kann auch einmal eine Verbindung öffnen und dann wiederholt Cursor öffnen und schliessen und eventuell sogar mehrere Cursor parallel aufmachen. Da so ein Cursor von der Datenbank unterstützt werden kann, werden auf Serverseite dafür unter Umständen Ressourcen verbraucht, die man durch schliessen des Cursors wieder freigibt.

Verfasst: Samstag 24. Februar 2007, 22:10
von PmanX
*EDIT* War zu langsam. Hätte meine Ausführungen sparen können :)
Miko hat geschrieben: warum macht man 2 mal die verbindung auf:

Code: Alles auswählen

verbindung= ....
c=verbindung.cursor()
Bin mir jetzt nicht sicher, ob ich das korrekt erkläre.

Code: Alles auswählen

conn = MySQLdb.connect (host = "localhost",
                           user = "testuser",
                           passwd = "testpass",
                           db = "test")
Würde ich mit einem Dateihandle vergleichen.

Code: Alles auswählen

cursor = conn.cursor ()
Ist Userspace für Deine Verbindung. Oder anders: conn ist der Schlüssel für cursor.
BlackJack hat einen wichtigen Hinweis gegeben, wenn Du 1mal pro min das Statement ausführst, verwende eine persistente Verbindung. Überprüfe das Statement.

Gruß P.

Verfasst: Samstag 24. Februar 2007, 23:40
von Miko
wie schon gesagt,
wenn ich einer permanente verbindung hab tut er die tabellen nicht updaten wenn sich was ändert. über das problem haben schon mehrere geklagt da bin ich nicht der einzigste