Ressourcenverbrauch Connection Open/Close

schnitt_tt

Mitglied
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:

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:

turtle

Top Contributor
wie seht Ihr das bzw hab ich einen Denkfehler bzw denke ich da etwas zu kurzfristig?

Ich denke schon, denn Du schliesst von Deinem Beispiel einer embedded DB auf eine allgemeine Sache, die so leider nicht stimmt.

"Normalerweise" laufen RDBMS im ServerModus auf teilweise sehr, sehr leistungsfähiger Hardware. Dieses können über JDBC angesprochen werden, benötigen dafür aber einen/mehrere Netzwerkzugriffe. Dieser Verbindungsaufbau dauert bei vielen DB um Grössenordnungen länger als die eigentliche SQL-Operation. Daher sollte man dieses verhindern und auf bereits aufgebaute Verbindungen (gepoolte Connection) zurückgreifen. Dein Beispiel mit einer embedded DB ist da kein guter Test weil ja überhaupt kein Netzwerkzugriff gemacht wird und die Daten in derselben JVM sind.

Wenn Dir das Einbinden einer weiteren Bibliothek nicht gefällt, kannst Du ja auch Deinen eigenen Connection-Pool schreiben. Aber dann wirst Du bemerken, dass da Anforderungen reinkommen, an die Du wahrscheinlich zu Anfang nicht gedacht hast. Zum Beispiel wie ist sichhergestellt, dass die Connection noch valide ist und benutzt werden kann? Alles in allem vermeiden die meisten Leute den Aufwand für die Erstellung eines eigenen Pools.
 

ARadauer

Top Contributor
hab mirs jetzt im detail nicht durchgelesen aber..

eine Fremdbibliothek ins Spiel (die xte lib *Hurra), hat laufzeittechnisch keine Vorteile
ich würd das effiziente poolen von teuren datenbank verbindungen (und das sind sie wirklich) schon als vorteil bezeichnen ...
 
S

schnitt

Gast
@turtle & ARadauer

ich beziehe mich bewußt nur auf Embedded, da mir das "EE in Java" aktuell egal ist !(Geschäftsanwendungen / WEB haben ihre eigenen Anforderungen (Netz, "Massen-User Request" etc).

Du ja auch Deinen eigenen Connection-Pool schreiben.

möchte ich nicht, aber warum sollte ich den verwenden ??? ich kann da noch keine Vorteile erkennen (lassen wir mal: "man wird später im Geschäftsleben eh damit konfrontiert" außen vor).
 
S

SlaterB

Gast
@schnitt_tt
was ist im Moment eigentlich konkret deine Aussage? ;)

> 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".

dieser Satz spricht sich also fürs Schließen aus, in der Interpretation, dass eine Connection nicht lange ungenutzt offen bleiben sollte,
ich persönlich kann mir da auch Verwaltungsaufwand für die DB vorstellen, welcher in Java noch schlechter zu messen ist,

dein Test jedenfalls misst, dass das Schließen rasend schnell geht,
ist das nicht eine Bestätigung dieses Hinweises auf 'schnelles Schließen'? ;)

wogegen könntest du dich richten, doch allein gegen das Langzeit-Offenhalten von Connections?,
dagegen arbeiten ConnectionPools auch teilweise, sind als Cache zwar sicher nicht Dauer-Öffner,
werden aber jedenfalls auch nicht allzu lange zuschauen wie offene Connections rosten
 

schnitt_tt

Mitglied
@turtel
Habe ich schon beantwortet.

aehm ... ich beziehe mich lediglich auf das arbeiten mit einer embedded DB. -> das millisekunden bei einer Geschäftsanwendung und massen von Usern eine Rolle spielen kann ich mir vorstellen ... dein Hinweis bezog sich meiner Ansicht nach auf "Geschäftsanwendungen" bzw das Umfeld in dem sich Geschäftsanwendungen tummeln.


@SlaterB

was ist im Moment eigentlich konkret deine Aussage?

mein test sagt für mich aus, das das öffnen und schliesen einer Connection auf meinem System bei einer Derby DB aus meiner Sicht sehr schnell geht und das Argument "hoher Resourcenverbrauch" aus meiner Sicht somit hinfällig ist .... (wobei der Aspekt "Arbeitspeicher" nicht betrachtet wurde).



wogegen könntest du dich richten, doch allein gegen das Langzeit-Offenhalten von Connections?,
dagegen arbeiten ConnectionPools auch teilweise, sind als Cache zwar sicher nicht Dauer-Öffner,
werden aber jedenfalls auch nicht allzu lange zuschauen wie offene Connections rosten

*gruebel ... das hab ich jetzt nicht ganz verstanden ..

Connection-Pools halten, soweit ich das verstanden habe, ein paar Connections vor um das erstellen und managen dieser Verbindungen so gering wie möglich zu halten. Das Überwachen einer Connection ob da ein SQL rangerauscht kommt oder nicht, kostet ja auch Zeit. Je mehr Verbindungen von der DB zu managen sind (überwachen) desto weniger DB-Resource stehen für das arbeiten der SQL`s zur Verfügung.... somit könnte ich mir zumindest die allgemeine Aussage "Connections sind Resourcenhungrig" erklären.

aber was bringt mir das bei einer Embedded Datenbank ????? da gibt`s vielleicht parallel 3 threads die auf die DB zugreifen ... dann passiert 10 Minuten nix, weil der User mit anderen Dingen beschäftigt ist ... hier mal wieder ein DB Zugriff .... das sind doch komplett andere Anforderung wie bei WEB / Geschäftsanwendungen ....

nur weil "jeder" sagt eine Connection ist teuer, soll man sich Connection-Pooling beschäftigen, in eine weitere Abhängikeit zu einem Fremdprodukt begeben, obwohl dies vielleicht für den "Embedded" Fall nicht notwendig ist ???;)
 
S

silentkill_8989

Gast
Nun mal ne ganz blöde Frage @ TE:

Du beharrst doch sowieso darauf das du Recht hast, warum diskutiert ihr hier dann überhaupt? Sicherlich is bei einer Embedded-DB wo so n paar SQL anfragen kommen ziemlich egal wieviele Connections offen sind. Das is auch bei einer Remote-DB relativ egal, so lange wie man halt nicht "viel" Verkehr hat.
 
Hey Leute!

Ich hätte auch mal eine Frage zum Ressourcenverbrauch bei einer Connection mit Java über JDBC. Ich hab ein kleines Verwaltungsprogramm geschrieben das mehrmals die Methoden "Datenbanktreiber laden" und "Connection aufbauen" verwendet.

So wie ich das jetzt verstanden hab, wäre es effizient einen Connection-Pool über das Einbinden einer weiteren Bibliothek zu nutzen, oder? Die beiden anderen Varianten wären ja entweder immer wieder eine Verbindung aufzubauen und wieder zu schließen. Oder die Verbindungen bestehen zu lassen, ohne immer wieder eine neue Verbindung zu nutzen. Beide Möglichkeiten würden viel Resourcen brauchen!

Ich hoffe es ist in Ordnung das ich keinen neuen Thread aufgemacht hab. Aber das hat so gut hierzu gepasst!

Gruß Markus
 
S

SlaterB

Gast
alles je nach Umständen richtig was du sagst, auch wenn das in diesem Thread widerlegt werden soll ;)

ich möchte nur anmerken, dass in einem einfachen Programm für alle Varianten genug Ressourcen da sein sollten,
darum musst du dir eigentlich keinen Kopf machen, lege eine Connection dauerhaft an und gut,

falls du wider Erwarten mit Problemen wie Verbindungsabbruch kämpfen musst, kannst du immer noch schauen,
ob die anderen Varianten besser sind,
aber falls du ConnectionPool nicht als unnötige Arbeit ansiehts, ist das langfristig sicher die beste Lösung, ja
 
alles je nach Umständen richtig was du sagst, auch wenn das in diesem Thread widerlegt werden soll ;)

ich möchte nur anmerken, dass in einem einfachen Programm für alle Varianten genug Ressourcen da sein sollten,
darum musst du dir eigentlich keinen Kopf machen, lege eine Connection dauerhaft an und gut,

falls du wider Erwarten mit Problemen wie Verbindungsabbruch kämpfen musst, kannst du immer noch schauen,
ob die anderen Varianten besser sind,
aber falls du ConnectionPool nicht als unnötige Arbeit ansiehts, ist das langfristig sicher die beste Lösung, ja

Wie lege ich denn eine dauerhafte Verbindung an? Bisher hab ich immer wenn benötigt die beiden Methoden aufgerufen, um den Treiber zu laden und eine Verbindung aufzubauen.

Code:
//Treiber wird geladen
GUI.methoden.startdriver(DAO.driver);
        
//Verbindung zur Datenbank
Connection conn = GUI.methoden.getConnection(DAO.url, DAO.user, DAO.passwort);
 
S

SlaterB

Gast
diese conn in einer statische Variable, schon für alle immer vergügbar, ähnlich System.out und andere,
hat viele Haken, z.B. schon zwei Threads gleichzeitig, aber für einfache kleine Programme denkbar
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Maxim6394 EclipseLink + SQLite | Unable to acquire a connection from driver [null] Datenbankprogrammierung 6
J PC-Start Problem JDBC Connection Datenbankprogrammierung 10
S Oracle DB-Connection in .jar file ändern Datenbankprogrammierung 11
yakazuqi MySQL MySQL Connection reset Datenbankprogrammierung 7
K Glassfish 4.1.1 Connection Pool u. Resource Ref Datenbankprogrammierung 20
OnDemand Hikari Pool Connection Validation Datenbankprogrammierung 18
Dimax MySQL Methodenaufruf mit Connection Übergabe Datenbankprogrammierung 8
D MySQL Connection richtig herstellen. Wie ? Datenbankprogrammierung 7
D Multiple Connection mit MySQL Datenbankprogrammierung 4
S Connection Pool Hikari Datenbankprogrammierung 7
P MySQL Connection Global Datenbankprogrammierung 13
J Connection Datenbankprogrammierung 1
F Brauche dringend Hilfe Java-Access Connection Datenbankprogrammierung 3
S New Connection Wizard / NetBeans Datenbankprogrammierung 0
P Frage zu Connection.close() Datenbankprogrammierung 4
T NoSQL Connection für die Thesis [GWT] Datenbankprogrammierung 1
M Connection erstellen Datenbankprogrammierung 1
F Monitoring DB Connection Pool Datenbankprogrammierung 3
H JDBCODBC - Connection-Objekt Datenbankprogrammierung 3
E MySQL SQL - wann connection schließen Datenbankprogrammierung 2
R HSQLDB Connection refused Datenbankprogrammierung 2
B JDBC Connection Fehler Datenbankprogrammierung 8
B JDBC-Connection: Data source name too long Datenbankprogrammierung 3
crashfinger jdbc-connection mit jre7 funktioniert nicht Datenbankprogrammierung 5
reibi Derby/JavaDB Connection refused Datenbankprogrammierung 14
W MySQL-Connection-Objekt übergeben Datenbankprogrammierung 2
N SQL-Connection Datenbankprogrammierung 3
B MySQL Datenbank Connection als String zurückgeben Datenbankprogrammierung 7
M Connection Pooling Datenbankprogrammierung 7
B MySQL Fehler: Cannot open connection mit Tomcat7, Hibernate und MySQL Datenbankprogrammierung 4
K Connection - möglich & nicht möglich Datenbankprogrammierung 2
T Datenbank connection mit Servlet Datenbankprogrammierung 4
S Applet stucks at SQL Connection (jTDS JDBC) Datenbankprogrammierung 15
c_sidi90 JDBC Oracle Connection schlägt fehl Datenbankprogrammierung 2
H H2 H2-Connection bei WebStart Datenbankprogrammierung 6
JavaKaffee Derby/JavaDB Quartz-WebAnwendung - Connection/Treiber Problem Datenbankprogrammierung 47
ruutaiokwu jdbc connection als singleton Datenbankprogrammierung 11
S Wie überprüfe ich ob die Instanz einer Connection gerade werwendet wird? Datenbankprogrammierung 4
X Connection schließen oder speichern? Performance Frage Datenbankprogrammierung 7
C Derby/JavaDB JavaDB: Keine Connection Datenbankprogrammierung 7
T Pooled Connection und Connection Pool Datenbankprogrammierung 2
S Java Connection to MySQL Datenbank FunPic Datenbankprogrammierung 4
Q java.lang.NullPointerException connection = null Datenbankprogrammierung 13
N Connection bleibt null Datenbankprogrammierung 7
H DB-Connection zu MySQL Datenbankprogrammierung 12
D Wie bekommt man die JDBC connection zum laufen?(Eclipse) Datenbankprogrammierung 16
T MySQL ResultSet zurückgeben nachdem Connection geschlossen wurde? Datenbankprogrammierung 3
B db2 jdbc connection Datenbankprogrammierung 4
G MySQL Connection Problem Datenbankprogrammierung 3
R sql.Connection vs. mysql.Connection Datenbankprogrammierung 3
R Connection Pooling - Tote Verbindungen Datenbankprogrammierung 5
S Connection Pool Datenbankprogrammierung 23
P JPA Connection dynamisch hinzufügen Datenbankprogrammierung 2
S JDBC connection open Datenbankprogrammierung 3
D MySQL Verständnisproblem mit globalen Variablen (Connection) Datenbankprogrammierung 7
F Connection refused: connect Bei Verbindungsherstellung zu MySQL Datenbank Datenbankprogrammierung 3
R Connection Problem für eine externe DB mit Java (JDBC) Datenbankprogrammierung 9
R Connection nur als root Datenbankprogrammierung 3
N Connection kann nicht geschlossen werden!? Datenbankprogrammierung 4
S JPA Hibernate: "The user must supply a jdbc connection" Datenbankprogrammierung 4
F MySQL - Connection JDBC-Driver Problem Datenbankprogrammierung 4
E MSSQL-Server connection aufbau sehr langsam Datenbankprogrammierung 2
S Zuviele DB Connection Datenbankprogrammierung 4
A Connection Variable in anderer Klasse verwenden -> statement Datenbankprogrammierung 2
S Connection String MS Access mit Systemdatenbank / Arbeitsgruppeninformationsdatei Datenbankprogrammierung 4
R DB-Connection, aber wie? Datenbankprogrammierung 2
F Java SQL Connection mit Rollback Datenbankprogrammierung 2
P DB- Connection lösen Datenbankprogrammierung 7
padde479 Connection String Oracle Datenbankprogrammierung 5
W JDBC Connection isValid()? Datenbankprogrammierung 4
G Frage zu connection? Datenbankprogrammierung 9
G allgemeine JDBC-Connection Frage Datenbankprogrammierung 2
H Wie kann ich eine Datenbank Connection aus XML-Datei lesen! Datenbankprogrammierung 2
J jdbc Oracle Connection refused Datenbankprogrammierung 6
D Probleme mit mysql-Connection Datenbankprogrammierung 10
K Wo "Connection" Object erstellen? Datenbankprogrammierung 7
N Kleine Frage zu Connection Pooling mit DataSource Datenbankprogrammierung 2
M Hilfe - keine Connection zur DB Datenbankprogrammierung 4
G Connection zu einer Oracle DB erstellen Datenbankprogrammierung 8
K Oracle XE Connection Problem Datenbankprogrammierung 2
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
G SQL Server Connection Datenbankprogrammierung 12
K "Connection timed out: connect" bei MySQL-Verbindu Datenbankprogrammierung 10
R Warum ist meine Connection null? Datenbankprogrammierung 6
B Connection Pools Datenbankprogrammierung 3
U Connection läuft nicht als jar Datenbankprogrammierung 6
R Interessantes Problem mit Connection-Pool. Datenbankprogrammierung 2
C Statement/Connection SQLWarning Datenbankprogrammierung 4
P Connection problems Datenbankprogrammierung 15
J Keine Connection zur MySQL Db Datenbankprogrammierung 6
K db connection wann schließen Datenbankprogrammierung 4
W Problem bei Connection mit SQLServer-Datenbanke mittels Java Datenbankprogrammierung 2
S Viele Klassen sollen eine Connection benutzen Datenbankprogrammierung 3
K Connection error Datenbankprogrammierung 18
G SQLException: No operations allowed after connection closed Datenbankprogrammierung 2
T problem mit mysql connection Datenbankprogrammierung 6
H Connection Pool + Tomcat + Oracle10g Datenbankprogrammierung 7
T JDBC Connection refused Problem Datenbankprogrammierung 6
L DB2 connection problem Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben