Mobile

SQL Mysql - Wann und was closen?

furryhamster

Lt. Commander
Registriert
Okt. 2008
Beiträge
1.101
Hi,

baue ne seite, wo 3-4 Statements teilweise abgesetzt. Beim testen habe ich mal so 30 refresh innerhalb kurzer Zeit gemacht, bis ich ein "too many connections" erhalten habe.

jetzt die Frage: wann sollte man eine datenbankverbindung, ein resultset und wann ein statement closen?
 
- Ein Statement wenn es fertig ist
- Ein Resultset wenn es nicht mehr gebraucht wird
- Eine Datenbankverbindung (je nach Anwendungszweck) beim Beenden des Programms oder auf Userwunsch.
 
Kannst Du etwas konkreter werden ? Sonst können wir hier nur raten. Ich glaube, dass du für jeden Query eine Connection öffnest und diesen nicht mehr schließt.
Ich würde also nur eine Connection öffnen, alle Queries absetzen und dann die Connection schließen.

Gruss Magic
 
sobald die verbindung nicht mehr gebraucht wird (eben nach dem das resutl da ist, oder das statement (select , update, delete oder was auch immer) abegesetzt wurde) sollte diese geschlossen werden

und nicht erst bei programm ende oder schon gar nicht auf userwunsch (der aufbau und das close, bekommt der beutzer gar nicht mit, er sol nur die daten sehen, ob die aus einer DB kommen, einem textfile oder aus einem anderen Programm ist fuer den user unerheblich und interesssiert ihn nicht)

Stell dir vor du willst dass dein prog mehrere benutzer hat, da wuerdest du sonst schnell das gleiche problem haben.
 
olampl schrieb:
und nicht erst bei programm ende oder schon gar nicht auf userwunsch (der aufbau und das close, bekommt der beutzer gar nicht mit, er sol nur die daten sehen, ob die aus einer DB kommen, einem textfile oder aus einem anderen Programm ist fuer den user unerheblich und interesssiert ihn nicht)

Je nach Anwendungszweck macht es schon Sinn die Verbindung zu öffnen oder zu schließen wenn der User das möchte. Ist wie mit Datei öffnen/schließen in Programmen.
Dumm ist IMHO bei jeder DB-Aktion eine Verbindung zu öffnen und danach gleich wieder zu schließen. Es verursacht unnötig Aufwand und je nach Datenbanksystem bleibt die Verbindung noch einige Zeit im Pool. 30 Aktionen innerhalb von 10 Sekunden können da schon zu "Too many connections" führen.
 
Ich weiß nicht wie fit du in Sachen Objektorientierung bist, aber ich würde versuchen den Zugriff auf die Datenbank in einer Klasse zu lösen - welche dir entsprechende Zugriffsmöglichkeiten auf die Resulte der Datenbank bietet.
Zudem währe es vielleicht sinnvoll erst nachdem alle Statements durchgelaufen sind für einen Aufruf die Connection zu beendet.
 
zum konkreter werten:

habe eine index-datei in der eine verbindung hergestellt wird. sieht so aus:
Code:
Statement stmt;
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/.....", "testuser", "test");
stmt = conn.createStatement();

Diese datei wird bei jedem link aufgerufen, da sie dynamisch was angezeigt werden soll included. setze ich jetzt ein ein select ab, erzeuge ich ein resultset und weise diesem das stmt zu. brauche ich parallel ein zweites select, erzeuge ich ein zweites statement.

nach euren antworten würde ich jetzt ein statement schließen, direkt nachdem es ausgeführt wurde, sodass das ergebnis im resultset ist und das resultset schließe ich, wenn ich es nicht mehr benötige. sollte ich jetzt die die connection (bei mir "conn") auch schließen am ende jeder seite?

Edit: teste das gerade aus. wenn ich ein statement schließe, nachdem ich es einem resultset zugewiesen habe, so erhalte ich folgende meldung: "Operation not allowed after ResultSet closed ". schließe ich das statement, nachdem ich das zugewiesene resultset zuletzt benutze, verhunzt mir das das ganze design, sprich alles verschoben. schließe ich das statement ganz am ende der seite, scheint es zu gehen
 
Zuletzt bearbeitet:
Zurück
Oben