ConnectHandle

05/03/2010 - 10:17 von Uli Münch | Report spam
Hallo NG,

seit Jahren verwende ich einen SQL-Server zur Datenspeicherung für meine
APPs.
Die ConnectHandle ermittle ich mit der Funktion
SQLSTRINGCONNECT([cConnectString])

Funktioniert perfekt.Was mir nicht klar ist?

Wie grosszügig oder auch nicht sollte man denn mit den ConnectHandle
umgehen? Ist es sinnvoll für eine APP viele ConnectHandle zu generieren oder
eher nicht?

Was sind die Vor- und Nachteile?

Ich bedanke mich für jeden Tipp.



mfG

Uli Münch
 

Lesen sie die antworten

#1 Bernhard Sander
05/03/2010 - 11:25 | Warnen spam
Hallo Uli,
Wie grosszügig oder auch nicht sollte man denn mit den ConnectHandle
umgehen? Ist es sinnvoll für eine APP viele ConnectHandle zu generieren oder
eher nicht?


Wenn die Frage so geradlinig zu beantworten wàre, hàtten die Datenbankersteller
und die ODBC-Programmierer nicht so viele Varianten einbauen müssen...
Da spielen gegenlàufige Aspekte eine Rolle.

Für viele Handles spricht die Faulheit des Programmierers, oder positiv
ausgedrückt: der Programmierer hat weniger Arbeit und kann das Programm zu einem
günstigeren Preis herstellen.

Eine Verbindung kostet Resourcen auf dem Server, nàheres dazu findest Du in der
Doku deines Datenbankservers.
Je nach Lizenzmodell der jeweiligen Installation kann die Anzahl der gleichzeit
nutzbaren Verbindungen (nicht nur der gleichzeitig angemeldeten Benutzer!)
eingeschrànkt sein, dann ist es schnell eine Kostenfrage aus der anderen Ecke.
Daher wàre das Ziel, möglichst wenige Verbindungen einzurichten.

Wenn Du in Deinem Programm jedoch ausgiebig mit mehreren parallelen
Transaktionen arbeitest, dann brauchst Du nach meiner Beobachtung für jede
Transaktion ein eigenes Handle. Gleiches gilt, wenn Du "Fetch As Needed" nutzt.
Dann ist die Verbindung auch so lange belegt, wie der laufende Abruf noch nicht
abgeschlossen ist.

Was auch Einfluss haben dürfte: ob man synchron oder asynchron arbeitet.
Bei synchron kommt man mit weniger Handles aus, denn solange das Handle belegt
ist, steht der Fuchs still und kann garnichts anderes machen, insbesondere hat
er keine Gelegenheit zur überlappenden Nutzung des Handles.
Bei asynchron können gleichzeitig mehrere unabhàngige SQL-Befehle aktiv sein,
dann braucht jeder der gleichzeitigen Befehl eine eigene Verbindung.

Dann unterscheidet Foxpro bzw. ODBC noch zwischen Connection Handle und
Statement Handle, wobei, so verstehe ich die Foxpro-Doku, mehrere Statement
Handles über das gleiche Connection Handle abgewickelt werden, siehe dazu
"Sharing Connections for Remote Data". Die Auswirkungen auf Seiten des
DB-Servers musst Du wieder in dessen Doku nachlesen.

Ich hatte es so gelöst:
- Eine generelle Verbindung, über die alle Transaktions-freien Befehle laufen.
- Alles, was eine Transaktion startet, bekommt eine eigene Verbindung. Am Ende
der Transaktion wird diese Verbindung wieder geschlossen.
"Fetch As Needed" habe ich mit DB2 im Hintergrund nicht zum Laufen gebracht,
daher fàllt der Aspekt weg. Ich habe stattdessen was eigenes programmiert, was
aus der Sicht der Verbindungen nur kleine Abrufe darstellt.
Bei meinem Programm kann man beliebig viele Fenster zu jedem Teilbereich
(Adresse, Artikel, ...) öffnen und jeweils unabhàngig in den betroffenen
Tabellen blàttern und arbeiten. Reine Abrufe (SELECT) konnten mangels synchron
und mangels "Fetch As Needed" nicht überlappend ausgeführt werden. Für
Speichervorgànge waren Transaktionen nötig und teilweise auch parallele reine
Abfrage, daher brauchten die Speichervorgànge eigene Handles.
Möglicherweise hàtte auch ein einziges Transaktionshandle für das ganze Programm
genügt. In ein paar wenigen vertrackten Konfliktgeschichten habe ich es aber
nicht mehr ohne weiteres vorhersehen können, ob weitere parallele Verbindungen
nötig sind oder nicht, daher habe ich jeder Transaktion ein eigenes Handle
zugestanden, das aber auch nur wàhrend der Transaktion geöffnet ist.

In der Praxis sieht es wohl so aus, dass das Programm meist nur eine Verbindung
offen hat und bei jedem Speicher-Vorgang noch eine 2. Verbindung öffnet. Ganz
selten dürfte es eintreten, dass mehr als 2 Verbindungen offen sind.

Wenn man multithreaded arbeitet, kann die Betrachtung schnell anders aussehen,
aber da spielt der Fuchs nicht ohne weiteres mit.


Gruß
Bernhard Sander

Ähnliche fragen