PDA

Vollständige Version anzeigen : Minimize the Number of Connections Made from Each Client - Aber wie?


Heiopei
27.09.2002, 11:31
Hallo liebe Leute,
im Microsoft Knowledgebase Artikel steht folgendes:

<a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;q300216" target="_blank">auch hier nachzulesen</a>


Minimize the Number of Connections Made from Each Client

If you can, design each client to use one, and only one, connection to the Microsoft Jet database. Each connection to a Jet database represents an independent client to the database, even when these connections come from the same client process. To optimize performance and network I/O and to reduce the multiuser stress on the back-end database, design the client application to use a single connection to the Jet database, and then share this connection over multiple recordsets as needed. This has the added benefit of preventing read/write delays in the client application. By default, there is a five-second delay between writing a value to the database and being able to read this updated value when writing and reading on two different Jet connections, even if the two connections reside in the same client process. If you use a single connection, you avoid this issue.


Das mit den fünf Sekunden schockt mich ein bißchen.

Wie finde ich raus wieviele connections ich gerade offen habe?
Verursacht ein Formular auf Tabellenbasis mit zwei Unterformularen eventuell drei Verbindungen? Und wenn das so ist, wie kommt man dann auf die geforderte Anzahl 1.

Vielleicht ist das der Schlüssel für meine lahme Backend-Datenbank, die ich dank Foren-Hilfe schon mal vor einem halbe Jahr beschleunigt hatte.

Weiß jemand Rat oder hat einen guten Lesetipp?

Liebe Grüße

Heiopei

Lanz Rudolf
28.09.2002, 14:25
Hallo Heiopei,
Da ich mich auch immer wider mit Optimierung befasse und mich das ganze, wie Du sicher noch weist sehr interessiert, habe ich einiges in dieser Hinsicht gesammelt.
Ich sende Dir ein EMail.
Gruss
Ruedi
PS.: Gilt Deine Offerte noch immer das ich Dir meine Dokumentation zur Korrektur zu kommen lasen kann?

Nouba
28.09.2002, 15:16
Hallo Heiopei,

ich habe folgendes ausgegoogelt: <a href="http://groups.google.de/groups?hl=de&amp;lr=&amp;ie=UTF-8&amp;oe=UTF-8&amp;threadm=Xns92698F4C2535Dlarsdoldhotmailcom%40207.46.239.39&amp;rnum=27&amp;prev=/groups%3Fq%3Djet%2 52Bminimize%2Bnumber%2Bconnection%26hl%3Dde%26lr%3D%26ie%3DUTF-8%26oe%3DUTF-8%26start%3D20%26sa%3DN">Betrifft:Minimieren von Verbindungen</a>

Heiopei
28.09.2002, 17:42
@ruedi: Klar das Angebot steht, wenn Du im Gegenzug bei der Migros für mich ein bißchen höhlengereiften Greyerzer erwirbst und mir zuschickst.

@nouba: Danke für den Hinweis. Ich beginne zu ahnen, um was es geht.

Nur im Detail muß ich nochmal genauer verstehen, wie ichs bei DAO anwende.

Henry Habermacher schrieb in dem oben gelinkten Beitrag:

Eine möglichkeit ist folgende:
Mach gleich beim Öffnen der Anwendung eine Connection in die Jet Database Engine auf. Definiere diese in irgend einem Standardmodul als Public. Nenn sie zB. MyStandardConnection
Im Code dann selber verwendest Du immer die MyStandardConnection, wenn Du auf ein Recordset zugreifst, statt jedes Mal eine neue Connection zu eröffnen und diese anschliessend wieder zu schliessen.
Gleiches funktioniert auch bei DAO über die Database Instanz, solange dort sichergestellt wird, dass diese bei Programmende auch sauber wieder vernichtet wird, sonst hängt evt. Access und lässt sich nicht beenden.
(Siehe diesbezüglich die FAQ)


Also für doofe:
Ich beleg eine Public-Variable mit
set db=currentdb()

und das wars??
Und dann sorg ich noch dafür, daß auf jeden Fall beim Beenden der Anwendung ein db.close erfolgt, oder wie??

Und mit dieser public-Variable db mach ich dann alle recordset-Spielereien in meinem Code?

OK. Aber was passiert mit Formularen, die auf Abfragen basieren? Oder soll ich mir die dann gleich ganz abgewöhnen?

Liebe Grüße

Heiopei

Sascha Trowitzsch
28.09.2002, 19:56
Zunächst mal ist vielleicht diese Lektüre in diesem Zusammenhang interessant:

<a href="http://www.microsoft.com/accessdev/articles/v35perf.htm" target="_blank">http://www.microsoft.com/accessdev/articles/v35perf.htm</a>

Daraus geht auch schon hervor (...wenn man sich mal durchgeschlagen hat), dass die ganze Sache schon ein wenig kompliziert ist.
--------------------
Wenn du mit A2000 arbeitest, kannst du das mit dem globalen CurrentDb machen und den Formularen dynamisch das Recordset zuweisen (Set Me.Recordset = dbs.OpenRecordset("MeineAbfrage",dbOpenDynaset) )
Ich glaube aber nicht, dass das die Performance sonderlich erhöht.

Außerdem wird, wenn man im Code Currentdb durch DBEngine(0)(0) ersetzt, die Performance auch besser (geringfügig).

Grundsätzlich bin ich aber auch der Meinung, dass man ruhig mehr mit glob. Variablen arbeiten kann.
Ich setze in DBs z.B. ein Klassenmodul ein, das diverse immer geöffnete Recordsets enthält, die öfters benötigt werden und auf die damit schnell zugegriffen werden kann. Das kostet zwar lokalen Speicher, entlastet aber das Netzwerk.
Das Klassenmodul stellt gleichzeitig sicher, dass die RS auch wieder sauber geschlossen werden.

HTH, Sascha

PS:Meinst du, der Migros-Greyezer ist besser als der im Kaisers Kolonnenstraße? ;)

[ 28. September 2002: Beitrag editiert von: Sascha Trowitzsch ]</p>

Heiopei
29.09.2002, 07:51
@Sascha:

>Meinst du, der Migros-Greyezer ist besser als
> der im Kaisers Kolonnenstraße?

Ich sehe schon, Du kennst den höhlengereiften Greyerzer nicht. :laugh:

Zum vollendeten Glück fehlt dann nur noch ein kleines Stück Bündner Birnbrot.
Dazu kann man dann natürlich auch Echten Bündner Bergkäse nehmen, der ist auch saugut, nur gibts dan nicht ganz so gut bei der Migros. obwohl die auch Bündner Bergkäse führt... :D

Falls es den allerdings doch in der Kolonnenstraße gibt, mußt Du jetzt nicht glauben, daß ich Dir irgendwelche Pamphlete Korrektur lese, denn dann hol ich mir den Käse lieber selbst... :p

Zur empfohlenen Lektüre äußer ich mich mal nach Konsum.

Bis denn.
Heiopei

Lanz Rudolf
29.09.2002, 11:05
Hallo zusammen,
Ich glaube ich muss hier etwas zum Thema Käse sagen.
Heiopei ich werde Dir natürlich Dein gewünschten höhlengereiften Greyerzer sende.
Da ich jedoch kein Fribourger :nene: (Freiburg/Schweiz) bin sondern ein gehbürtiger Emmentaler, werde ich Dir auch ein wenig höhlengereiften Emmentaler senden und da wir im nächsten Monat von Neuenegg nach Merligen am schönen Thunersee Umziehen, werde ich Dir gerne auch ein Brienzermutschli (super Gut oder noch besser <:holy: ) der Käserei Haldemann (das ist mein Cousin) senden. Last but not list, wenn ich das nächste mal selber Käse mache was es manchmal gibt (dürfte jedoch etwas dauern wegen Umzug), sende ich Dir original Ruedi-Käse, (ich bin im Käsen fast so gut wie in ACCESS :laugh: ). Also Du siehst, Du hast hier mit Deinem Käse Wunsch bei mir offene und sachverständige Ohren gefunden.

Aber wie läuft die Performance Massnamen bei Dir ?

PS: Cousin => VETTER für alle nicht Schweizer

Heiopei
30.09.2002, 16:33
@Ruedi:
Na dann nix wie her mit dem Skript. ;)

Die Performance-Diskussion wolte ich ja gar nicht prinzipiell wieder eröffnen. Aber ich glaubte beim Lesen des oben zitierten KB-Artikels, daß vielleicht irgend was ganz entscheidenes an mir vorbeigeht, was ich schlicht und ergreifend nicht verstehe.

Liebe Grüße
Heie

Heiopei
30.09.2002, 21:10
@Sascha:

Ich hab den oben gelinkten Text gelesen und verstehe langsam die Zusammenhänge. Einn wirklich guter Tipp. :top:

Ich bin, ehrlich gesagt, erstaunt, wie konstruktiv die Microsoft-offiziellen Hilfen sind. Oder ist das Jet-Entwicklerteam auch nur zugekauft ? ;-)

Mach´s gut.
Heie

Thönnißen H.
01.10.2002, 08:36
Vielen Dank für die guten Tipps
Ich war kurz vor einer Verzweiflungstag

Kann aber leider nur mit holländischem Käse dienen

Mose.P
15.08.2003, 14:44
Hallo Sascha und alle anderen,
habe gerade diesen Abschnitt aufmerksam durchgelesen:
Original geschrieben von Sascha Trowitzsch
Ich setze in DBs z.B. ein Klassenmodul ein, das diverse immer geöffnete Recordsets enthält, die öfters benötigt werden und auf die damit schnell zugegriffen werden kann. Das kostet zwar lokalen Speicher, entlastet aber das Netzwerk.
Das Klassenmodul stellt gleichzeitig sicher, dass die RS auch wieder sauber geschlossen werden.

Das könnte mich bei meinem Problems mit dem langsamen Formularaufbau weiterbringen (http://www.ms-office-forum.net/forum/showthread.php?threadid=99212).

Wenn ich also meine statischen Recordsets (was den SQL-String angeht) in einem "Startup-Klassenmodul" definiere, könnte alles etwas schneller sein (und vor allem kann ich die .close-Problematik besser in den Griff bekommen).
Meine Frage nun:
Wie baue ich so ein Klassenmodul auf und wie funktioniert das mit dem Aufruf?

Ich bin jetzt so weit:
1. Bei Module "Einfügen" -> "Klassenmodul" wählen.

Und jetzt? :confused: (Verzeiht bitte meine Dummheit... habe noch nie mit Klassenmodulen, sondern nur mit Standardmodulen gearbeitet)

Sascha Trowitzsch
15.08.2003, 16:45
Es muss ja gar kein Klassenmodul sein!

Beispiel:

Du hast ein Formular, das seine Daten aus einer Abfrage bekommt:

"SELECT * FROM Tabelle ORDER BY Tabelle.Namen"

Beim Aufruf dieses Formular muss jedesmal diese Abfrage ausgeführt werden, und alle Datensätze übers Netzt transferiert werden, damit die Daten nach "Namen" sortiert werden können.

Wenn das beim Start der DB gleich zu Anfang in ein Recordset eingelesen wird, so hat man die Daten für das Formular immer:

Public dbs As Database, rsGlob As DAO.Recordset

Public Function AutoStart()
Set dbs = CurrentDb
Set rsGlob = dbs.OpenRecordset("SELECT * FROM Tabelle ORDER BY Tabelle.Namen", dbOpenDynaset)
End Function

Beim Aufruf des (ungebundenen!) Formulars:

Private Sub Form_Load
Set Me.Recordset = rsGlob
End Sub

Das funktioniert wie gesagt nur in A2000/XP !!

Aber eine Warnung: Es gibt nach diesem Verfahren in langsamen Netzen mitunter eigenartigste Fehlermeldungen der Art "Konnte das Steuerelement XY in Formular Z nicht finden" oder "X:\XY ist kein zulässiger
Pfad"

Ciao, Sascha