Hallo
bei Programmen mit DB wird man ständig daraufhingewiesen, dass man die Connection schliesen sollte wenn man sie nicht mehr benötigt. Angeblich würde eine Connection viel "Resourcen brauchen".
Da ich primär mit embedded Datenbanken zutun habe, habe ich versucht etwas mehr Licht für diesen Anwendungsfall ins Dunkel zu bringen:
(DERBY DB) Test wie lange das Öffnen und Schliesen der Connection benötigt via:
das Ergebniss:
-> 1000x öffnen / schliesen benötigt ca `ne halbe sekunde, das hört sich für mich nicht wirklich viel an. Wenn ich mir überlege das eine Transaktion ja grundsätzlich so aussieht
1) open connection
2) create statement
3) execute
4) mach was mit dem ResultSet
5) close ResultSet / close Statement
6) close connection
würde ich kühn :lol:behaupten das Öffnen und Schliesen einer Verbindung fällt da Laufzeitmäßig nicht ins Gewicht. Die Speicherseite kann ich leider nicht überprüfen, hierfür werde ich mich wohl mit einem Profiler auseinandersetzen müßen.
Falls das Open/Close einer Verbindung nicht zum "Speicher zu müllen" führt könnte man doch folgendes festhalten: (alles bezogen auf embedded Datebanken in Desktop Applicationen)
a) jeder Thread der Application bekommt seine eigene Connection und kümmert sich um diesen
somit ist der Fallstrick wer verwendet was beim Multithreading schonmal gelöst.
b) Verwendung eines Connections-pool "spart" lediglich Tipparbeit, bringt eventuell
eine Fremdbibliothek ins Spiel (die xte lib *Hurra), hat laufzeittechnisch keine Vorteile
???? warum sollte man den Pool verwenden ????
c) man könnte auch so 10 Connections permanent anlegen, die lediglich für bestimmte Aufgaben verwendet werden dürfen.
Thread1 = con1 (die Langläufer prozesse)
Thread2 = con2 (adhoc abfragen)
.....
aber nur um sich das öffnen / schliesen zu sparen -> imho konzeptioneller Overkill
wie seht Ihr das bzw hab ich einen Denkfehler bzw denke ich da etwas zu kurzfristig?
steck die Crux im Speicherverbrauch ?
bei Programmen mit DB wird man ständig daraufhingewiesen, dass man die Connection schliesen sollte wenn man sie nicht mehr benötigt. Angeblich würde eine Connection viel "Resourcen brauchen".
Da ich primär mit embedded Datenbanken zutun habe, habe ich versucht etwas mehr Licht für diesen Anwendungsfall ins Dunkel zu bringen:
(DERBY DB) Test wie lange das Öffnen und Schliesen der Connection benötigt via:
Java:
public void checkOpenCLoseConnection(int anzahlLoops)
{
for ( int i = 0; i < anzahlLoops; i++)
{
try
{
Connection test_con1;
test_con1 = DriverManager.getConnection( Datenbank.databaseLocation);
test_con1.setAutoCommit( false );
test_con1.close();
test_con1 = null;
} catch (SQLException e) {
e.printStackTrace();
}
}
}
das Ergebniss:
Java:
Loops Minuten Sekunden Milli Mikro Nano
1 0 0 1 1.136 1.136.881
100 0 0 85 85.957 85.957.969
1000 0 0 622 622.972 622.972.138
10000 0 2 2.205 2.205.511 2.205.511.851
100000 0 6 6.961 6.961.976 6.961.976.411
-> 1000x öffnen / schliesen benötigt ca `ne halbe sekunde, das hört sich für mich nicht wirklich viel an. Wenn ich mir überlege das eine Transaktion ja grundsätzlich so aussieht
1) open connection
2) create statement
3) execute
4) mach was mit dem ResultSet
5) close ResultSet / close Statement
6) close connection
würde ich kühn :lol:behaupten das Öffnen und Schliesen einer Verbindung fällt da Laufzeitmäßig nicht ins Gewicht. Die Speicherseite kann ich leider nicht überprüfen, hierfür werde ich mich wohl mit einem Profiler auseinandersetzen müßen.
Falls das Open/Close einer Verbindung nicht zum "Speicher zu müllen" führt könnte man doch folgendes festhalten: (alles bezogen auf embedded Datebanken in Desktop Applicationen)
a) jeder Thread der Application bekommt seine eigene Connection und kümmert sich um diesen
somit ist der Fallstrick wer verwendet was beim Multithreading schonmal gelöst.
b) Verwendung eines Connections-pool "spart" lediglich Tipparbeit, bringt eventuell
eine Fremdbibliothek ins Spiel (die xte lib *Hurra), hat laufzeittechnisch keine Vorteile
???? warum sollte man den Pool verwenden ????
c) man könnte auch so 10 Connections permanent anlegen, die lediglich für bestimmte Aufgaben verwendet werden dürfen.
Thread1 = con1 (die Langläufer prozesse)
Thread2 = con2 (adhoc abfragen)
.....
aber nur um sich das öffnen / schliesen zu sparen -> imho konzeptioneller Overkill
wie seht Ihr das bzw hab ich einen Denkfehler bzw denke ich da etwas zu kurzfristig?
steck die Crux im Speicherverbrauch ?
Zuletzt bearbeitet von einem Moderator: