MySQL Connect

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Hallo Zusammen,

ich habe ein (für mich) sehr verwirrendes Problem.

Ich stelle über ein CGI Script eine Verbindung zu einem MySQL Server her, das funktioniert prinzipiell auch gut.

CGI Script das per Web aufgerufen wird

Code: Alles auswählen

form = cgi.FieldStorage()
con=dbConnection.getDBConnection()

print "Content-Type: text/html"
print ""

id=form.getfirst('id','0')
sql="select * from dcodes where catID=" + id;

try:
    con.query(sql)
    ....
Hier die Methode um die Connection zu bekommen

Code: Alles auswählen

import MySQLdb;

def getDBConnection():
    connectionURL="127.0.0.1"
    connectionUser="root"
    connectionPassword=""
    connectionDatabase="dcoding"
    con=None;
    
    try:
        con=MySQLdb.connect(connectionURL,  connectionUser, connectionPassword, connectionDatabase)
    except Exception,e:
        con=e
    finally:
        return con
Und jetzt kommt das Hexenwerk. Ich rufe das CGI Script auf, mit einer bestimmten ID (Bsp. 5) OHNE das die Datenbank Online ist. > Ich bekomme logischerweise eine Fehlermeldung:

[INFO] (2003, "Can't connect to MySQL server on '127.0.0.1' (10061)")

Jetzt starte ich den Datenbank Server, rufe das CGI Script mit derselben ID auf (5), dieselbe Fehlermeldung. Er ruft die DB Methoden korrekt auf, versucht aber scheinbar bei gleicher ID nicht wirklich eine Verbindung auf zu bauen sondern nimmt die Daten die er vorher hatte...?!?!?!

Sobald ich das Script mit einer anderen ID anspreche, bekomme ich eine Verbindung:

[INFO] <_mysql.connection open to '127.0.0.1' at bce600>

Anders rum funktioniert das übrigents auch.

MySQL Server ist Online, auruf CGI
[INFO] ID: 121 <_mysql.connection open to '127.0.0.1' at bce710>

danach fahre ich den Server runter, MySQL Server ist Offline:
[INFO] ID: 121<_mysql.connection open to '127.0.0.1' at bce710>
[INFO] ID: 122(2003, "Can't connect to MySQL server on '127.0.0.1' (10061)")

Er scheint die Daten irgendwie irgendwo irgendwann zu cachen und ich hab keine Ahnung wo und warum :( ( er bekommt übrigents trotz herruntergefahrenem MySQL Server nicht nur angeblich eine Verbindung sondern auch die Daten die er vorher geladen hat) Jemand eine Idee woran so was liegen könnte?

Danke schon mal
D
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,

wahrscheinlich hat dein Browser die Seite aus dem Cache geholt anstatt die Anfrage neu zu stellen. Leere mal den Cache des Browsers und versuch's nochmal.

Gruß,
Manuel
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Das geht scheinbar in die richtige Richtung, wenn ich den Cache des Browsers lösche funktioniert es wie es soll.

Mich wundert dann aber das er das CGI Script richtig ausgeführt wird. Das ganze ist ja nicht nur ein Anzeige Problem. Wie gesagt sieht man in den Logs, das er das CGI Script ordentlich aufruft (Cache hin oder her), und auch versucht eine Verbindung auf zu bauen.

Ein Caching, so wie ich es kenne würde so aussehen, was ich auch nachvollziehen könnte:

1.CGI hatte eine Verbindung zum MySQL Server, zeigt die Daten an.
2.MySQL Server wird herruntergefahren
3.CGI versucht eine Verbindung auf zu bauen > schlägt fehlt
4.Anzeige bleibt trotzdem (weil ja gecachet)

bei mir sieht das ganze ja etwas seltsamer aus:

1.CGI hatte eine Verbindung zum MySQL Server, zeigt die Daten an.
2.MySQL Server wird herruntergefahren
3.CGI versucht eine Verbindung auf zu bauen > bekommt eine (obwohl Server Offline)
4.Anzeige bleibt trotzdem

Ich verstehe einfach nicht inwieweit der BrowserCache das CGI Script beeinflusst, das ja komischerweise eine Verbindung bekommt, obwohl der MySQL Server inzwischen runter gefahren ist...

*kreisch* Ideen?
Dom
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Woran siehts Du denn, dass eine Verbindung zur DB zustande kommt? Anhand welcher Logs genau?

Wie erkennst Du eigentlich, was Deine getDBConnection() da zurückliefert? Ich würde das finally ja eher durch ein else ersetzen - aber vielleicht liege ich da auch falsch ;-)

Ich denke ja, dass Dein Punkt 3 eben nicht stattfindet! Wenn der Browser Deine Seite cached, wird er die Anfrage ja eben gerade nicht erneut senden! Das ist ja der Sinn vom Caching. Und so passt es ja auch zur Beobachtung (mit Ausnahme der angeblichen Connection zur DB).
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Hyperion hat geschrieben:Woran siehts Du denn, dass eine Verbindung zur DB zustande kommt? Anhand welcher Logs genau?
mhhh ich hatte mir die Response vom CGI Script ausgeben lassen. Jetzt da ich noch mal drüber nachdenken bin ich mir doch nicht mehr so sicher dass das Script wirklich noch mal ausgeführt wird. Aber das würde ja bedeuten das er einen Aufruf Cached... also erkennt er das er die Url mit dem Parameter schon mal aufgerufen hat und nimmt die Response die er vom letzten mal hatte? Das ist ja ein wenig gruselig :) wie kann ich das Problem denn in diesem Fall umgehen, also sicher stellen das er den CGI Call auf jeden Fall macht und nicht selber entscheidet das es nicht nötig ist??

Meine sponaten (blöde :D) Idee wäre an die URL nen Zeitstempel als Parameter zu hängen den ich gar nicht auswerte, aber das kann ja nicht der elegante Weg sein oder?

Danke (mal wieder)
Dom
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

da.dom hat geschrieben:
Hyperion hat geschrieben:Woran siehts Du denn, dass eine Verbindung zur DB zustande kommt? Anhand welcher Logs genau?
mhhh ich hatte mir die Response vom CGI Script ausgeben lassen.
Na das ist ja eben gerade kein Garant dafür, dass das Script noch mal erneut ausgeführt wird! Da muss man in Log-Files gucken ...
Aber das würde ja bedeuten das er einen Aufruf Cached... also erkennt er das er die Url mit dem Parameter schon mal aufgerufen hat und nimmt die Response die er vom letzten mal hatte? Das ist ja ein wenig gruselig :)
Hehe ... das nennt man ja grad caching ;-)
wie kann ich das Problem denn in diesem Fall umgehen, also sicher stellen das er den CGI Call auf jeden Fall macht und nicht selber entscheidet das es nicht nötig ist??
Hm ... iirc gabs da ne meta Angabe im HTML, welches von Browsern interpretiert werden kann ... da musste mal googlen!
da.dom
User
Beiträge: 114
Registriert: Dienstag 10. Juni 2008, 14:42

Hyperion hat geschrieben:[
Hm ... iirc gabs da ne meta Angabe im HTML
Hab dazu ein bisschen was gefunden, allerdings gefällt mir das nicht sooo ganz. Ist eine reine JavaScript/Ajax Seite, was bedeuten würde das der Cache für die gesamte Anwendung deaktiviert wäre. Habs erst mal mit nem TimeStamp gemacht, das geht, negativ dabei nur das dann ja nehme ich an der Cache ordentlich anschwillt, weil er alle alten Aufrufe cachet (bis zum Browser schließen oder Seite verlassen), die er gar nicht mehr benötigt, oder wie verhält sich das?

Grüße
Dom
Antworten