Python und MySQL Datenbank

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Miko

Samstag 24. Februar 2007, 12:39

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.
BlackJack

Samstag 24. Februar 2007, 13:01

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.
Miko

Samstag 24. Februar 2007, 13:19

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
BlackJack

Samstag 24. Februar 2007, 14:23

Kann es sein dass Du einfach irgendwo ein `commit()` vergessen hast?
Miko

Samstag 24. Februar 2007, 16:47

ich hab immer c.execute("commit")
mach ich überall außer bei selects
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Samstag 24. Februar 2007, 17:22

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.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 24. Februar 2007, 17:45

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]

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Samstag 24. Februar 2007, 18:41

Sind Transaktionen jetzt Standard?

Über welche Version reden wir?
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Samstag 24. Februar 2007, 19:45

Connection.commit() ist im DB-API 2.0 spezifiziert, ja.

http://www.python.org/dev/peps/pep-0249/
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Miko

Samstag 24. Februar 2007, 20:10

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!
BlackJack

Samstag 24. Februar 2007, 21:59

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.
PmanX
User
Beiträge: 123
Registriert: Donnerstag 25. Januar 2007, 13:50
Wohnort: Germany.BB.LOS
Kontaktdaten:

Samstag 24. Februar 2007, 22:10

*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.
Miko

Samstag 24. Februar 2007, 23:40

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
Antworten