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.
Python und MySQL Datenbank
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.
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
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
-
- User
- Beiträge: 123
- Registriert: Donnerstag 25. Januar 2007, 13:50
- Wohnort: Germany.BB.LOS
- Kontaktdaten:
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 ()
Ohne Beispielcode und Konfiguration müssen wir raten.
Gruß P.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
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:
und wieder 2 mal zu?
schöne grüße
Miko
edit:
muss ich auch bei Select ein commit machen?
edit2:
JUHU jetzt schließt er sie immer wieder. DANKE!
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()
Code: Alles auswählen
c.close()
verbindung.close()
Miko
edit:
muss ich auch bei Select ein commit machen?
edit2:
JUHU jetzt schließt er sie immer wieder. DANKE!
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.
-
- User
- Beiträge: 123
- Registriert: Donnerstag 25. Januar 2007, 13:50
- Wohnort: Germany.BB.LOS
- Kontaktdaten:
*EDIT* War zu langsam. Hätte meine Ausführungen sparen können
Würde ich mit einem Dateihandle vergleichen.
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.
Bin mir jetzt nicht sicher, ob ich das korrekt erkläre.Miko hat geschrieben: warum macht man 2 mal die verbindung auf:Code: Alles auswählen
verbindung= .... c=verbindung.cursor()
Code: Alles auswählen
conn = MySQLdb.connect (host = "localhost",
user = "testuser",
passwd = "testpass",
db = "test")
Code: Alles auswählen
cursor = conn.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.
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
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