Hi,
Ich habe hier in einem Projekt vor mir folgenden Code.
Der sieht eigentlich halbwegs sauber aus - aber das Problem ist das die Methode wohl zu oft aufgerufen wird.
Die Datenbank geht wegen der vielen Verbindungen in die Knie (oder eher auf den Boden)
Wenn dann der Finally-block abgearbeitet wird und die Verbindungen zurück gegeben werden ist die Datenbank aber schon hinüber und es bringt nichts mehr.
daher wollte ich euch mal fragen was man da machen kann am Code ohne alles auf den Kopf zu stellen.
Kann man die Verbindung früher schließen und nicht erst "nach dem return" und trotzdem so generisch bleiben?
Oder kann man innerhalb der Methode eine queue machen um es bis zu einer max Anzahl an Verbindungen zu zu lassen und dann eben blockiert?
Da dieser Bereich eigentlich nicht "mein" code ist wollte ich daran möglichst eingeschränkt Änderungen durchführen.
Ich hoffe ihr könnt mir ein paar tips geben
Code ist ein bisschen vereinfacht - aber es sollte alles da sein.
Ich habe hier in einem Projekt vor mir folgenden Code.
Der sieht eigentlich halbwegs sauber aus - aber das Problem ist das die Methode wohl zu oft aufgerufen wird.
Die Datenbank geht wegen der vielen Verbindungen in die Knie (oder eher auf den Boden)
Wenn dann der Finally-block abgearbeitet wird und die Verbindungen zurück gegeben werden ist die Datenbank aber schon hinüber und es bringt nichts mehr.
daher wollte ich euch mal fragen was man da machen kann am Code ohne alles auf den Kopf zu stellen.
Kann man die Verbindung früher schließen und nicht erst "nach dem return" und trotzdem so generisch bleiben?
Oder kann man innerhalb der Methode eine queue machen um es bis zu einer max Anzahl an Verbindungen zu zu lassen und dann eben blockiert?
Da dieser Bereich eigentlich nicht "mein" code ist wollte ich daran möglichst eingeschränkt Änderungen durchführen.
Ich hoffe ihr könnt mir ein paar tips geben
Code:
private <T> T executeQuery(String query, ResultContainer<T> resultContainer, PreSetter... preSetters) throws Exception{
try {
Connection c = null;
try {
PooledDataSource dataSource = atomicPooledDataSource.get(); // AtomicReference<PooledDataSource>
if (dataSource == null) {
throw new Exception("No DB Connection");
}
c = dataSource.getConnection();
PreparedStatement s = null;
try {
int i = 1;
s = c.prepareStatement(query);
for (PreSetter preSetter : preSetters) {
i = preSetter.prepare(s, i);
}
ResultSet rs = null;
try {
rs = s.executeQuery();
return resultContainer.result(rs);
} finally {
if (rs != null) {
rs.close();
}
}
} finally {
if (s != null) {
s.close();
}
}
} finally {
if (c != null) {
c.close();
}
}
} catch (SQLException e) {
throw new Exception(e.getMessage(), e);
}
}
Code ist ein bisschen vereinfacht - aber es sollte alles da sein.