Hallo!
ich habe hier folgendes Problem:
Ich habe einen Webservice über Axis2(welcher als Servlet in einem Tomcat 5.5) laufen.
Dieser Webservice besteht aus POJOs die wie folgt aufgebaut sind:
Es gibt eine Container-Klasse, von der alle Klassen abgleitet sind. Dieser Container stellt die Datenbankverbindung her und hält eine Variable vom Typ "Connection".
Die Methoden der Kindklassen holen sich diese über die Methode "getConnection()":
Zur Information hier noch der Code der Methode connect():
Ich habe beide Teile getestet - einmal mit direkter DB-Verbindung und einmal mit dem DBCP von Tomcat gestet. Das Ergebnis war jeweils das gleiche:
Bei Version 1 macht die Datenbank irgendwann wegen zu vieler Verbindungen dicht. Bei Version 2 leert sich der Pool schnell und ich bekomme keine Verbindung mehr.
Ich gehe also davon aus, dass die Verbindungen nicht geschlossen werden, weshalb ich folgendes gemacht habe:
Um den Service "nach außen" zu "präsentieren" gibt es eine Fassadenklasse, die im Prinzip alle Servicemethoden beinhaltet. Eine Methode sei hier exemplarisch gegeben (Login):
wobei freeConnection() aus dem Container stammt und wie folgt aussieht:
Leider scheint dies absolut nix zu bringen und ich frage mich, wie ich es wohl geschickter anfangen kann.
Macht es Sinn, jede Methode der Kindklassen so umzuschreiben, dass sie eine eigene Connection halten und vor Rückgabe des Wertes diese schließen?
Ich bin mittlerweile wirklich ratlos und brauche schnell Hilfe, da der Termin immer näher rückt. Ich hoffe auf Eure Hilfe.
Vielen Dank!
ich habe hier folgendes Problem:
Ich habe einen Webservice über Axis2(welcher als Servlet in einem Tomcat 5.5) laufen.
Dieser Webservice besteht aus POJOs die wie folgt aufgebaut sind:
Es gibt eine Container-Klasse, von der alle Klassen abgleitet sind. Dieser Container stellt die Datenbankverbindung her und hält eine Variable vom Typ "Connection".
Die Methoden der Kindklassen holen sich diese über die Methode "getConnection()":
Code:
public synchronized Connection getConnection(){
try {
if(this.con == null || this.con.isClosed()){
this.connect();
log.info("Made a DB reconnect.");
}
return this.con;
} catch (Exception e) {
log.error("Unable to reconnect,", e);
}
return null;
}
Code:
private void connect(){
/*
* LOCAL
*/
try{
PropertyConfigurator.configure("/usr/share/tomcat5.5/webapps/axis2/WEB-INF/classes/log4j.properties");
Class.forName("com.mysql.jdbc.Driver");
this.con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db?autoReconnect=true", "user", "pass");
log.debug("Database-Connection established");
}catch (Exception e) {
log.error("Connection failed!",e);
}
/*
* CONNECTION POOLING FROM TOMCAT
*/
if(dataSource == null){
try {
InitialContext initCtx = new InitialContext();
Context ctx = (Context) initCtx.lookup("java:comp/env");
//Context ctx = new InitialContext();
if (ctx == null) {
log.error("No InitialContext available");
} else {
dataSource = (DataSource) ctx.lookup("jdbc/MysqlPool");
}
} catch (NamingException ne) {
log.error(ne);
}
}
try {
this.con = dataSource.getConnection();
} catch (SQLException e) {
log.error(e);
}
}
Bei Version 1 macht die Datenbank irgendwann wegen zu vieler Verbindungen dicht. Bei Version 2 leert sich der Pool schnell und ich bekomme keine Verbindung mehr.
Ich gehe also davon aus, dass die Verbindungen nicht geschlossen werden, weshalb ich folgendes gemacht habe:
Um den Service "nach außen" zu "präsentieren" gibt es eine Fassadenklasse, die im Prinzip alle Servicemethoden beinhaltet. Eine Methode sei hier exemplarisch gegeben (Login):
Code:
public String login(String apikey){
String session = this.session.login(apikey);
// ensure connection is returned to pool!
this.session.freeConnection();
return session;
}
Code:
public synchronized void freeConnection(){
try {
if(!this.con.isClosed())
this.con.close();
log.info("Closed db-Connection");
} catch (Exception e) {
log.error("Unable to close db-Connection", e);
}
}
Leider scheint dies absolut nix zu bringen und ich frage mich, wie ich es wohl geschickter anfangen kann.
Macht es Sinn, jede Methode der Kindklassen so umzuschreiben, dass sie eine eigene Connection halten und vor Rückgabe des Wertes diese schließen?
Ich bin mittlerweile wirklich ratlos und brauche schnell Hilfe, da der Termin immer näher rückt. Ich hoffe auf Eure Hilfe.
Vielen Dank!