Domino 9 und frühere Versionen > ND6: Entwicklung
Wie synchronisiere ich Dokumente aus verschiedenen DBs am besten?
Mark³:
Ok, nochmal für den eiligen Leser: ;D
Wie durch einen anderen Beitrag von mir in diesem Forum hinlänglich bekannt möchte ich eine Datenbank entwickeln zur Abrechnung von Datenbanken auf unseren Servern. Die Infos der Datenbanken stehen entweder im Datenbankkatalog oder ich hole sie mir über Notesdbdirectory -> Notesdatabase. Den zweiteren Weg gehe ich nun.
Für jede Datenbak lege ich ein Dokument an mit Daten wie Name, Größe etc., in dieses Dokument schreibe ich noch manuell Infos über den Owner, die ich aus unserer Org-DB aktualisiere (2. Synch-Vorgang, bisher nicht erwähnt)
Ist denn performancemässig ein Unterschied ob die View (oder der Folder) durch Autoupdate=True den Index aktualisiert wenn ich doc.RemoveFromFolder mache oder ich manuell view.refresh mache bei Autoupdate=False?
Aber wie bereits gesagt dass sind eher akademische Fragen, das ganze läuft in akzeptabler Zeit ab.
flaite:
Finds Schade, dass gerade die erfahreneren Kräfte hier solche Kommunikationsschwierigkeiten haben.
Ich habe erst auch davor gesessen und gerätselt.
Ich würds so ausdrücken (an Meinungen interessiert):
Du hast 3 Datenquellen (
- Datenbank Katalog
- die neue Datenbank mit den Datenbankinfo Dokumenten
- die Org-DB
Diese 3 Datenbanken gemeinsam bilden ein abstraktes Modell, das bestimmte Daten in Beziehung bringt, die für deine Organisation einen ökonomischen Wert haben. Informationen über Notesdatenbanken auf euren Servern (Größe, Ort, Eigentümer, etc.).
Dieses Datenbankmodell weist Redundanzen auf und das führt dazu, dass das Modell zeitweilig nicht konsistent ist.
a)Bestimmte Daten sind im Datenbank-Katalog und in der neuen Datenbank redundant vorhanden (Datensätze zu Datenbanken auf einem Server).
b) Bestimmte Daten sind in der neuen Datenbank und in der ORG-Db redundant vorhanden. (Datenbank-Eigentümer)
Der "Synchronisations-Prozess" sorgt nun dafür, dass die redundanten Daten zu bestimmten regelmässigen Zeitpunkten konsistent gemacht werden. Das führende System ist in a) der Datenbank-Katalog und in b) die ORG-DB.
Ich glaub nicht, dass Synchronisation hier ein glücklicher Begriff ist. Ich z.B. verstehe unter Synchronisation hauptsächlich, dass eine übergeordnete Instanz dafür sorgt, dass 2 oder mehr Prozesse nicht gleichzeitig ablaufen sondern nacheinander.
Z.B. wird in nebenläufiger Programmierung (Threads) synchronized klar auf Prozesse (oder Threads) bezogen und zwar nicht nur in Java. Und in der Datenbank-Theorie glaub ich auch. Da spricht man auch von der Synchronisation gleichzeitiger Zugriffe (d.h. Prozesse) im Kontext von diesen Serializable, Repeatable Read, etc. Zeug. Die Daten selber werden aber nicht synchronisiert, sondern da verwendet man eher konsistent oder nicht-konsistent. (IMHO).
Für mich ist dein geschilderter Fall eine Sache von Konsistenz des Datenmodells.
Ich find das Thema aber interessant. Ich benutze quasi nie dieses autoupdate-property, dass man ja in Iris Datenbanken ziemlich häufig findet.
Gruß Axel
Mark³:
Danke für die Ausführungen, Axel O0
Das trifft es schon recht gut, ich hatte versucht, möglichst wenige Details zu erzählen, um dem Kern meiner Frage mehr Gewicht zu verleihen und weil ich solche Fragen während der Arbeit stelle und nicht viel Zeit für die Formulierung habe. Aber wenn niemand das Problem versteht bekomme ich natürlich auch keine vernünftigen Antworten.
Ein Problem bei meinen Fragen ist häufig, dass ich nicht nach einer möglichen Lösung frage, sondern dass ich viele verschiedene Wege sehe, wie man ein Problem lösen kann und nur Hilfe bei der Wahl der geeignetsten Lösung brauche. Man kann sich schließlich nur weiterentwickeln, wenn man jeden eingeschlagenen Weg kritisch prüft und nicht die erstbeste Lösung wählt nur um schnell fertig zu sein.
flaite:
Dieses Posting hat Spaß gemacht. Schön das es intersubjektiv nachvollziehbar zu sein scheint. :D
--- Zitat von: mt69clp am 30.10.05 - 09:19:29 ---Das trifft es schon recht gut, ich hatte versucht, möglichst wenige Details zu erzählen, um dem Kern meiner Frage mehr Gewicht zu verleihen und weil ich solche Fragen während der Arbeit stelle und nicht viel Zeit für die Formulierung habe.
--- Ende Zitat ---
Das kenn ich. ;D
Ist aber auch, weil im Notes Bereich einfach so Design/Architecture Buzzword Literatur nicht vorhanden ist. Und v.a. in den letzten 2 Jahren habe ich da zunehmend viel aus anderen Bereichen (Datenbanktheorie, OO, Java) gelesen.
Axel
Mark³:
ich habe die Autoupdate-Geschichte mal mit LSTimer gemessen. Es waren nur 2 Messungen, die Ergebnisse waren aber so ähnlich, dass die Autoupdate-Geschichte mir irrelevant zu sein scheint:
Zum Vorgehen: Ich schiebe alle vorhandenen Dokumente in einen Update-Ordner, vergleiche jedes Dokument mit einem Datensatz und entferne dieses Dokument dann aus dem Update-Ordner. In meinem Test hatte ich ca 400 Dokumente. Die Zeiten für das Aktualisieren waren etwa identisch, etwas kürzer beim Lauf MIT manuellem Refresh (49000ms +-1000ms). Ich habe den Agenten lokal gestartet, das DBDirectory liegt auf dem Server. Das Caching kann natürlich hier was verfälschen (allerdings kann ein view.refresh wohl nicht aus dem Cache kommen, oder?)
Lange Rede, kurzer Sinn: Zum einen scheint das manuelle Refresh nicht notwendig zu sein, da das Ergebnis gleich ist, zum anderen sind die Zeiten bei meinen Datenmengen etwa gleich. Unten seht ihr den relevanten Code des Agenten:
--- Code: ---Set session = New NotesSession
Set dbThis = session.CurrentDatabase
Set docProfile = dbThis.GetProfileDocument(SETUP_PROFILE)
Set vAllDocs = dbThis.GetView(VIEW_ALL_DOCS)
Set vecAllDocs = vAllDocs.AllEntries
Set vUpdateFolder = dbThis.GetView(UPDATE_FOLDER)
Call openProtokoll("Abgleich der Abrechnungsdaten")
vUpdateFolder.AutoUpdate = False
vUpdateFolder.Refresh
'Put all docs into update folder
Call vecAllDocs.PutAllInFolder(UPDATE_FOLDER)
If (docProfile Is Nothing) Then
Call LogErrorEx("Profile " & SETUP_PROFILE & " doc not found.", 2, Nothing)
Exit Sub
End If
If (docProfile.HasItem(SERVERLIST)) Then
varServers = docProfile.GetItemValue(SERVERLIST)
lngDBCount = 0
Forall srv In varServers
Set dbDir = New NotesDbDirectory(srv)
Set db = dbDir.GetFirstDatabase(DATABASE)
While Not db Is Nothing
lngDBCount = lngDBCount + 1
Print Cstr(lngDBCount) + " - " + db.Title
'get corresponding doc
strKey = db.ReplicaID
Set doc = vUpdateFolder.GetDocumentByKey(strKey, True)
If (doc Is Nothing) Then
Call createDoc(db)
lngNewCount = lngNewCount + 1
Else
Call updateDoc(db)
Call doc.RemoveFromFolder(UPDATE_FOLDER)
vUpdateFolder.Refresh
lngUpdateCount = lngUpdateCount + 1
End If
Set db = dbdir.GetNextDatabase()
Wend
End Forall
'the remaining docs in update folder have to be marked as deleted
Set vecRemainingDocs = vUpdateFolder.AllEntries
lngDelCount = vecRemainingDocs.Count
Call vecRemainingDocs.StampAll(STATUS_FIELD, DELETED_STATUS)
Call vecRemainingDocs.RemoveAllFromFolder(UPDATE_FOLDER)
End If
--- Ende Code ---
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln