Domino 9 und frühere Versionen > ND8: Entwicklung
Agent mit vielen Datenbank-Zugriffen - Performance Problem
DaHias:
Hi zusammen,
Ich arbeite aktuell an einer universellen Taskliste für die Nutzer. Dazu soll ein Agent aus einigen Datenbanken Informationen abgreifen, wie viele ToDo's für jeden einzelnen Nutzer vorliegen.
Dazu wird folgender Code genutzt:
--- Code: --- Set doc = dc.GetFirstDocument
While Not doc Is Nothing
NotesName = doc.NotesName(0)
Print NotesName
'Call logAgent.logAction("Zugriff auf DBs für " + NotesName)
doc.CtAPW = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ; "LNS001DB" : "Workflow\\VUN\\VUN.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
doc.CtFremdMAToGo = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ; "LNS001DB" : "Workflow\\VUN\\VUN.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
doc.CtBEWERB = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ; "LNS001DB" : "ESG\\Mail-In\\Bewerber.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
doc.CtCar = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ; "LNS001DB" : "IntroProd\\ESGCAR2.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
doc.CtKantine = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ; "LNS001DB" : "Workflow\\Kantine\\Kantine_Appl.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
doc.CtPA = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ; "LNS001DB" : "Workflow\\PA\\Personal.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
doc.CtReise = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ; "LNS001DB" : "Workflow\\Reise\\ReiseSap.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
doc.CtUSA = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ; "LNS001DB" : "Workflow\\Überstunden\\Überstundenantrag.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
doc.CtWB = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ; "LNS001DB" : "Workflow\\Weiterbildung\\wbildzwfappl.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
doc.CtSWG = Evaluate ( | @Elements(@DbLookup( "" : "NoCache" ; "LNS001DB" : "Workflow\\SoftwareGenehmigung\\Software.nsf" ; "MyActivities" ; "| + NotesName + |" ; 4)) |)
Call doc.Save (True, False)
Set doc = dc.Getnextdocument(doc)
Wend
--- Ende Code ---
Der Agent läuft in der selben Datenbank, in der der Code liegt und es gibt ca. 1700 Dokumente (also Nutzer). Es wird dann für jeden Nutezr in die Datenbanken auf eine spezielle Ansicht zugegriffen und für den Nutzer wird die Anzahl der Elemente abgefragt. Die Ansicht in der jeweiligen Datenbank ist schon so konfiguriert, dass dort eine derartige Anfrage genutzt werden kann und die Informationen ansich bekomme ich auch.
Was jetzt mein Problem ist, ist die Performance (wie man sich das vllt denken kann). Starte ich den Agenten auf dem gleichen Server, dauert die Abfrage 2:30 Minuten (variiert natürlich, aber wäre ok). Der Agent soll aber ca. alle 10 Minuten laufen um die Daten stets aktuell zu halten. Daher hat unser Admin die Datenbank inkl. Agent auf einen anderen Server verschoben. Dort dauert die Abfrage aber leider weit über 10 Minuten, da hier über das Netzwerk auf den anderen Server zugegriffen werden muss.
Daher nun zwei Fragen nach Ideen:
* Kennt jemand eine andere Lösung als mit so einem DBLookup an die gewünschten Infos zu kommen?
* Mal abgesehen davon, dass die Leitung zwischen den beiden Server langsam sein kann - welche Möglichkeiten habe ich, vom anderen Server aus zu prüfen, warum das so langsam ist?
Vielen Dank für Tipps!
Grüße,
Mathias
CarstenB:
Mach nicht 10 Lookups sondern reduzier die Anzahl, indem du mehrere Werte mit Trennzeichen in eine Spalte schreibst und nach dem Lookup trennst du das wieder auf
DaHias:
Ich geh aber mit jedem Lookup in eine andere Datenbank. Dann geht das doch nicht oder?
CarstenB:
oh richtig, ich hab nur gesehen, dass die ersten beiden Lookups auf die gleiche DB gehen. Da hab ich wohl etwas zu schnell gelesen
Tode:
Evaluate ist in dem Sinn sicher die schlechteste Lösung was Performance angeht...
Da es wohl nur um Anzahl Dokumente geht würde ich folgendes Machen:
In den Zieldatenbanken Ansichten erstellen, die Kategorisiert sind nach Notes- Name und in der zweiten Spalte eine "1" haben, und die Option "Summe".
Dann sieht die Ansicht (Teilweise aufgeklappt) so aus:
\/Heike Herrlich 5
1
1
1
1
1
>Tido Test 10
Dann würde ich über die Ansicht per NotesViewNavigator gehen und über
getFirstCategory und getNextCategory alle NotesViewEntries holen, die den Kategorien entsprechen und dann eine Liste mit Werten bilden:
Dim myList List as Integer
myList( viewEntry.ColumnValues(0) ) = viewEntry.ColumnValues(1)
Erst dann würde ich die Dokumente durchlaufen und einfach
doc.CtAPW = myList( NotesName ) machen...
Wenn die Anzahl der docs wesentlich geringer ist als die Anzahl der Kategorien in den Ansichten, dann würde ich ggf. anstatt die Liste zu bilden direkt über NotesViewEntry.GetDocumentByKey( ) oder über NotesView.CreateViewNavFromCategory() den Eintrag holen...
Das sollte von der Performance wesentlich besser sein...
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln