Hallo,
ich hatte ein seltsames Problem, das ich zwar mittlerweille gelöst habe, jedoch nicht verstanden habe, wiso es überhaupt auftritt.
Ich habe ein Programm das über einen Tomcat Connection Pool Verbindungen mit der Datenbank aufbaut.
Dies funktionierte auch alles einwandfrei, jedoch bekame nach einer gewissen Anzahl keine neuen Verbindugen, da der Pool leer war.
Ich konnte es auf die Select Statements zurueckfuehren.
Dort habe ich es so realisiert, das eine Methode das Statement entgegennimmt und die Abfrage durchführt .
Als Return liefert es das ResultSet zurueck.
Die eigentliche Methode verarbeitet das ResultSet und schließt über das ResultSet die Verbindung mit der Datenbank wie folgt:
Dies hat nicht funktioniert. Die Connection kam nicht zurueck in den Pool.
Erst als ich die in der Methode getInformation erstellten Objekte (Connection-Obj & Statement-Obj) geschlossen habe konnte er dies wieder zurueck in den Pool geben.
Nun meine Frage:
Warum funktioniert es, wenn ich die Objecte direkt schließe wo ist da der unterschied zu den relativen Objekten wenn ich das Statement und die Connection über das ResultSet besorge ?
Dazu muss ich jedoch noch sagen das es sich bei dem ResultSet um eine von mir entwickelte Proxy methode handelt. Jedoch ist nur die Methode getString verändert alles andere wird an das Ursprüngliche result weitergeleitet.
Hoffe ihr versteht was ich mein und könnt mir eine Antwort geben.
Danke für eure Hilfe.
Fasibio
ich hatte ein seltsames Problem, das ich zwar mittlerweille gelöst habe, jedoch nicht verstanden habe, wiso es überhaupt auftritt.
Ich habe ein Programm das über einen Tomcat Connection Pool Verbindungen mit der Datenbank aufbaut.
Dies funktionierte auch alles einwandfrei, jedoch bekame nach einer gewissen Anzahl keine neuen Verbindugen, da der Pool leer war.
Ich konnte es auf die Select Statements zurueckfuehren.
Dort habe ich es so realisiert, das eine Methode das Statement entgegennimmt und die Abfrage durchführt .
Als Return liefert es das ResultSet zurueck.
Java:
protected ResultSet getInfomation(String sql,Object... map) throws SQLException{
PreparedStatement query ;
try {
query = getNewConnection(true).prepareStatement(sql);//Liefert ein neue Connection aus dem Pool und aus dieser ein Statement
setPreparedElements(query, map);//Verbindet die Elemente in MAP mit dem Statement
log.debug(query);
ResultSet set = query.executeQuery();
return getDecodeResultSet(set);//Ein ResultSet Proxy (Da die Werte in der DB verschlüsselt sind) wird im Proxy die Methode getString verändert sonst nichts
} catch (SQLException e) {
log.error(e);
throw e;
}
}
Die eigentliche Methode verarbeitet das ResultSet und schließt über das ResultSet die Verbindung mit der Datenbank wie folgt:
Java:
ResultSet set = getInfomation("STATEMENT");
// Mach was mit set
set.getStatement().getConnection().close();
set.getStatement().close();
set.close();
Dies hat nicht funktioniert. Die Connection kam nicht zurueck in den Pool.
Erst als ich die in der Methode getInformation erstellten Objekte (Connection-Obj & Statement-Obj) geschlossen habe konnte er dies wieder zurueck in den Pool geben.
Nun meine Frage:
Warum funktioniert es, wenn ich die Objecte direkt schließe wo ist da der unterschied zu den relativen Objekten wenn ich das Statement und die Connection über das ResultSet besorge ?
Dazu muss ich jedoch noch sagen das es sich bei dem ResultSet um eine von mir entwickelte Proxy methode handelt. Jedoch ist nur die Methode getString verändert alles andere wird an das Ursprüngliche result weitergeleitet.
Hoffe ihr versteht was ich mein und könnt mir eine Antwort geben.
Danke für eure Hilfe.
Fasibio