Hallo Leute,
ich habe gerade ein Problem mit Java Servlet und der Datenbankanbindung.
Ich habe eine statische Klasse DB, die von anderen Klassen benutzt wird, es sind ca. 200 Stellen, wo DB.Connect() sowie eine weitere Funktion aus der DB Klasse aufgerufen wird. Das Problem ist jetzt bei mir die eben erwähnte Connect Methode:
Das Problem bei mir ist, dass es keinen festen Einstiegspunkt in das Servlet gibt. Man landet direkt in einer Methode (RPC). Deshalb kann jede Methode potentiell die erste Methode sein, die seit dem Restart des Servlets läuft. Deshalb habe ich auch in jede dieser Methoden den Connect Aufruf hinzugefügt. Am Anfang dachte ich eigentlich, dass die Servlets ähnlich laufen, wie ein PHP Script, wo bei jedem Aufruf ein Grundzustand herrscht. Deshalb war am Anfang die con.close(); nicht drinn. Aber irgendwann hat der MySQL wegen zu vielen Verbindungen dicht gemacht. Deshalb habe ich vor jedem Verbindungsaufbau die Verbindung geschlossen.
Eine Zeit lang lief das auch ganz gut, nur dann kam das Problem der Running Conditions. Denn die RPC Methoden sehen in etwa so aus:
Jetzt sind sagen wir mal zwei User online. Für den Ersten läuft die Methode durch, er ist jetzt bei DB.Foo(). In diesem Moment ruft ein zweiter User die Methode auf. In diesem Moment reißt con.close(); des zweiten Users dem ersten User die Datenbank Verbindung unter den Füßen weg und das ganze läuft in eine Exception rein.
Deshalb nun dir Frage, wie man so etwas anders realisieren könnte, damit eine Verbindung nur dann aufgebaut wird, wenn eine "alte" abgebrochen wurde, weil z.B. der DB Server mal ein paar min nicht erreichbar war.
ich habe gerade ein Problem mit Java Servlet und der Datenbankanbindung.
Ich habe eine statische Klasse DB, die von anderen Klassen benutzt wird, es sind ca. 200 Stellen, wo DB.Connect() sowie eine weitere Funktion aus der DB Klasse aufgerufen wird. Das Problem ist jetzt bei mir die eben erwähnte Connect Methode:
Code:
public static void Connect(){
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://" + Config.get_mysql_host() + ":3306/"+Config.get_mysql_dbname();
if(con!=null)
con.close();
Connection con = DriverManager.getConnection(url, Config.get_mysql_username(), Config.get_mysql_pwd());
stmt = (Statement) con.createStatement();
}catch( Exception e ) {
e.printStackTrace();
}
}
Das Problem bei mir ist, dass es keinen festen Einstiegspunkt in das Servlet gibt. Man landet direkt in einer Methode (RPC). Deshalb kann jede Methode potentiell die erste Methode sein, die seit dem Restart des Servlets läuft. Deshalb habe ich auch in jede dieser Methoden den Connect Aufruf hinzugefügt. Am Anfang dachte ich eigentlich, dass die Servlets ähnlich laufen, wie ein PHP Script, wo bei jedem Aufruf ein Grundzustand herrscht. Deshalb war am Anfang die con.close(); nicht drinn. Aber irgendwann hat der MySQL wegen zu vielen Verbindungen dicht gemacht. Deshalb habe ich vor jedem Verbindungsaufbau die Verbindung geschlossen.
Eine Zeit lang lief das auch ganz gut, nur dann kam das Problem der Running Conditions. Denn die RPC Methoden sehen in etwa so aus:
Code:
DB.Connect();
DB.checkLogin(key);
DB.Foo();
Jetzt sind sagen wir mal zwei User online. Für den Ersten läuft die Methode durch, er ist jetzt bei DB.Foo(). In diesem Moment ruft ein zweiter User die Methode auf. In diesem Moment reißt con.close(); des zweiten Users dem ersten User die Datenbank Verbindung unter den Füßen weg und das ganze läuft in eine Exception rein.
Deshalb nun dir Frage, wie man so etwas anders realisieren könnte, damit eine Verbindung nur dann aufgebaut wird, wenn eine "alte" abgebrochen wurde, weil z.B. der DB Server mal ein paar min nicht erreichbar war.