Ich habe hier eine Problem mit einem archäologischen Stück Java Software.
Das ganze ist in einem einfachen teil Code – Über sein Servlet wird eine Methode aufgerufen, die eine Datenbank abfrage durchführt und dann einen wert zurück liefert.
Jetzt ist das Problem das die DB connections nicht geschlossen werden, und daher irgendwann auslaufen.
Was mir gesagt wurde wo der Code im Einsatz ist - das die das schon kennen, und eine alter Java Bug ist, das unter last das finally nicht zum Zug kommt ..
Da frage ich mich - kann den das stimmen?
Was ich gelesen habe, kommt finally immer dran, außer man beendet den Thread komplett - System.exit(), OOM, JVM oder gar OS crash.
Aber sonnst sollte es immer funktionieren.
Oder kennt jemand tatsächlich einen BUG in alten versionen (kann mir vorstellen, dass das noch 1er versionen dort sind)???
Was meint ihr? Oder habt ihr andere Ideen?
LG,
Paul
Gut heute würde man es eher so um schreiben (ja eigentlich ganz anders, aber ihr wisst hoffentlich was ich meine.
Das ganze ist in einem einfachen teil Code – Über sein Servlet wird eine Methode aufgerufen, die eine Datenbank abfrage durchführt und dann einen wert zurück liefert.
Jetzt ist das Problem das die DB connections nicht geschlossen werden, und daher irgendwann auslaufen.
Was mir gesagt wurde wo der Code im Einsatz ist - das die das schon kennen, und eine alter Java Bug ist, das unter last das finally nicht zum Zug kommt ..
Da frage ich mich - kann den das stimmen?
Was ich gelesen habe, kommt finally immer dran, außer man beendet den Thread komplett - System.exit(), OOM, JVM oder gar OS crash.
Aber sonnst sollte es immer funktionieren.
Oder kennt jemand tatsächlich einen BUG in alten versionen (kann mir vorstellen, dass das noch 1er versionen dort sind)???
Was meint ihr? Oder habt ihr andere Ideen?
LG,
Paul
Java:
public int checkDb() {
Connection con = null;
int retVal = -1;
try {
con = getConnection(); // java.sql.Connection
final CallableStatement cstmt = con.prepareCall("{call DB.CheckDb()}");
// ...
// ...
return retVal;
} catch (SQLException e) {
// Logging
} finally {
if (con != null) {
try {
con.close();
} catch (SQLException e) {
// Logging
}
}
}
return retVal;
}
Gut heute würde man es eher so um schreiben (ja eigentlich ganz anders, aber ihr wisst hoffentlich was ich meine.
Java:
public int checkDb() {
Connection con = null;
int retVal = -1;
try (Connection = getConnection()) {
con = getConnection(); // java.sql.Connection
final CallableStatement cstmt = con.prepareCall("{call DB.CheckDb()}");
// ...
// ...
return retVal;
} catch (SQLException e) {
// Logging
}
return retVal;
}