# Warum ist es aufwendig eine Datenbankverbindung herzustellen



## JockelFragtNach (9. Nov 2007)

Hallo!

Immer wieder hört man, dass es sehr kostspielig sei, eine Datenbankverbindung aufzubauen. 

Ich frage mich allerdings, was daran wirklich so kostspielig ist. 

Hier steht beispielsweise: 
"Database connections are often expensive to create because of the overhead of establishing a network connection and initializing a database connection session in the back end database. In turn, connection session initialization often requires time consuming processing to perform user authentication, establish transactional contexts and establish other aspects of the session that are required for subsequent database usage."

Also 2 Sachen sind demnach aufwendig: 
1. Aufbau der Verbindung, also TCP-Verbindung z.B. 
2. Initialisierung einer Session z.B. Authentifizierung, das mit Transaction Context versteh ich eigentlich nicht, wird der nicht erst aufgebaut, wenn man wirklich eine Anweisung abschießt?

OK. Der erste Punkt kann nicht so wahnsinnig teuer sein, schließlich hat man das gleiche auch bei jeder Anfrage eines Browsers an einen Webserver. Für den Aufbau der TCP-Verbindung brauche ich 3 Meldungen, three-way-Handshake, die hin- und hergehen.

Und was ist an dem 2. Punkt hinsichtlich der Übertragungen so aufwendig? 
Wieviele Meldungen müssen denn für Authentifizierung hin- und hergehen? 
Meiner Meinung nach reichen 2. 
1. Nachricht mit Nutzername und Passwort
2. Bestätigung oder Ablehnung

sind also insgesamt in der TCP-Instanz 4 Meldungen, Nachricht + Bestätigung. 

Sind also insgesamt 7 Meldungen, die Hin- und Hergehen müssen, bevor man die erste Anfrage machen kann. 
Im Vergleich dazu 3 Meldungen, bevor Browser eine Anfrage stellen kann. 


Ist das Alles? Das Verhältnis von 7:3?

Was ist zusätzlich aufwendig? Das Kreieren eines Connection-Objekte an sich, also abzüglich der gerade berechneten Zeiten für die Roundtrips?

Vielen Dank für die Antworten im Voraus. Wenn ihr mir geholfen habt, gönne ich euch auch ein schönes WE, vorher nicht. ;-)

bis dann, 

Jörg


----------



## AlArenal (9. Nov 2007)

Schonmal daran gedacht, dass für eine neue DB-Verbindung serverseitig ein neuer Prozess gestartet werden muss?

Der Vergleich mit einem Webbrowser ist ziemlich banane. Ich kenne genug Spaghetti-Code wo einer pro Seitenaufruf zig DB-Verbindungen aufbaut. Das Verhältnis Web- zu DB-Verbindungen ist daher bestenfalls 1:1.

P.S.:
Ich hab schon Wochenende und wenn du dich auf den Kopf stellst!


----------



## SlaterB (9. Nov 2007)

1.
> Database connections are often expensive to create because of the overhead of establishing a network connection 

dies ist nicht im Vergleich zu einer Browser-Verbindung gemeint, sondern z.B. im Vergleich zu einen lokalen Cache im Hauptspeicher/ Festplatte,
auch eine Browser-Verbindung ist elendig langsam, darum gibts ja auch einen Webseiten-Cache

2.
beim zweiten Punkt siehst du nur die x Nachrichten, die einfache TCP-Verbindung zur Datenbank, dabei steht doch in dem englischen Text viel mehr, Transaktionskontext usw, da siehst du locker drüber weg?

> das mit Transaction Context versteh ich eigentlich nicht, wird der nicht erst aufgebaut, wenn man wirklich eine Anweisung abschießt? 

ach doch nicht, tja, ich weiß es auch nicht so genau, wenn aber jemand sagt, dass es dauert, dann vielleicht mit Grund


----------



## maki (9. Nov 2007)

> 1. Aufbau der Verbindung, also TCP-Verbindung z.B.
> ...
> OK. Der erste Punkt kann nicht so wahnsinnig teuer sein, schließlich hat man das gleiche auch bei jeder Anfrage eines Browsers an einen Webserver. Für den Aufbau der TCP-Verbindung brauche ich 3 Meldungen, three-way-Handshake, die hin- und hergehen.


Da übersiehst du etwas 

Zugriffe auf den Hauptspeicher zB. liegen im Nanosekunden Bereich, während die Latenzzeiten des Netzwerkes im Milli-, bestenfalls im oberen Microsekunden Bereich liegen, das ist ein riesengroßer Unterschied.
Ob es allerdings subjektiv Wahrgenommen wird ist eine andere Frage.



> 2. Initialisierung einer Session z.B. Authentifizierung, das mit Transaction Context versteh ich eigentlich nicht, wird der nicht erst aufgebaut, wenn man wirklich eine Anweisung abschießt?
> ...
> Und was ist an dem 2. Punkt hinsichtlich der Übertragungen so aufwendig?
> Wieviele Meldungen müssen denn für Authentifizierung hin- und hergehen?
> ...


Je nach Sicherheitsstufe ist es dann einiges mehr, dazu kommt das einige DBs wirklich lange brauchen um eine Connection zu erstellen, schliesslich Poolen ja zeitkritische/grössere Anwendungen und brauchen so nicht oft eine neue zu erstellen.
Das beenden einer Verbindung braucht auch Ressourcen.



> sind also insgesamt in der TCP-Instanz 4 Meldungen, Nachricht + Bestätigung.
> 
> Sind also insgesamt 7 Meldungen, die Hin- und Hergehen müssen, bevor man die erste Anfrage machen kann.
> Im Vergleich dazu 3 Meldungen, bevor Browser eine Anfrage stellen kann.


Ich halte das überspitzt gesagt für eine "Milchmädchenrechung".

Der Browser bedient nur einen einzigen User, während der Server alle Browser bedient, je nach Anwendung kommen da bis zu ein paar hundert User zusammen, da macht sich da ständige öffnen &schliessen der DB Verbindung sehr schnell bemerkbar.

Auf Tomcat zB. kann man einen ConnectionPool vom Server verwalten lassen, deine Webanwendung würde über JNDI daruf zugreifen. Damit wäre auch die Änderung der DB Konfiguration (Username, Passwort, IP/Servername, Port, Anzahl der gepoolten Verbindungen, etc. pp.) möglich ohne deine Anwednung zu ändern.


----------

