Autor Thema: Wie synchronisiere ich Dokumente aus verschiedenen DBs am besten?  (Gelesen 1932 mal)

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Ich möchte für jede Datenbank auf unseren Servern automatisch ein Dokument erzeugen und hier manuell zusätzliche Infos reinschreiben. Nach der Anlage der Dokumente sollen diese dann automatisch mit dem tatsächlichen Datenbankbestand aktuell gehalten werden. Es handelt sich also um ein Problem der Synchronisation, also Quelle sind die tatsächlich vorhandenen Datenbanken und Ziel sind meine Dokumente. Löschungen von Datenbanken sollen zu einem Status 'gelöscht' in meinen Dokumenten führen.
Nun suche ich einen optimalen Algorithmus für die Synchronisation. Wir haben ähnliche DBs im Feld, die alle Dokumente in einen Update-Ordner legen. Dann werden alle Dokumente, die in Quelle und Ziel über einen Schlüssel zu finden sind aktualisiert und aus dem Folder entfernt. Alle Datensätze, die in der Quelle, nicht aber im Ziel vorhanden sind werden hinzugefügt und alle die im Update-Ordner liegenbleiben weil sie keine Übereinstimmung hatten müssen also Löschungen sein.
Ist die PutAllInFolder-Geschichte bei einigen Tausend Dokumenten der beste Ansatz oder wie könnte man es besser machen?

Ich habe schon einen Blick auf DWFSync geworfen, das ist aber zu unübersichtlich (oder mächtig) um da brauchbare Teile rauszuschneiden.
« Letzte Änderung: 31.10.05 - 10:16:30 von mt69clp »
sagt Mark.



slowfood.de

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
0 Antworten bei 23x angeschaut könnte aussagen, dass mein Ansatz so schlecht nicht ist.
Nachdem ich alle Docs in einen Folder packe mache ich
Code
folder.AutoUpdate=False
folder.refresh

und nach jedem abgearbeiteten Dokument
Code
doc.RemoveFromFolder
folder.refresh
Ist das sinnvoll und bringt Performance oder ist das eher  O0 und tut das gleiche wie Autoupdate = true ?

Naja, schaun mer mal am Montag
sagt Mark.



slowfood.de

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
ich habe mir das Thema 22 x angeschaut  ;D

was willst du denn aus DWFSYNC "rausschneiden" ?

Du könntest es einfach konfigurieren und für deine Zwecke "nutzen" ...
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
DWFSync synchronisiert Dokumente aus verschiedenen DBs, ich synchronisiere Eigenschaften der Klasse NotesDBDirectory mit meinen Dokumenten. Den Datenbankkatalog möchte und kann ich aufgrund unserer Infrastruktur hier nicht verwenden.
Zuerst wollte ich mir das Prinzip der Synchronisation aus DWFSync rauskopieren aber das ist so objektmässig programmiert das mir das zu lange dauerte da durchzusteigen (was nicht heißen soll, dass es nicht gut programmiert ist).
Meine jetzige Lösung (ist 30% fertig) ist dagegen viel einfacher, ich traue aber diesem Folder-hin und hergeschiebe nicht so, aber das scheint doch zu klappen.
sagt Mark.



slowfood.de

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Der 23. Anschauer war wohl ich ... Und ich sehe immer noch nicht durch, was Du da treibst.

Zitat
also Quelle sind die tatsächlich vorhandenen Datenbanken und Ziel sind meine Dokumente. ...
Wir haben ähnliche DBs im Feld, die alle Dokumente in einen Update-Ordner legen.
...
Alle Datensätze, die in der Quelle, nicht aber im Ziel vorhanden sind werden hinzugefügt und alle die im Update-Ordner liegenbleiben weil sie keine Übereinstimmung hatten müssen also Löschungen sein.

Jetzt heisst es
ich synchronisiere Eigenschaften der Klasse NotesDBDirectory mit meinen Dokumenten.
NotesDBDirectory hat nun gerade zwei Eigenschaften. Dokumente synchronisieren, NotesDBDirectory-Properties mit Dokumenten synchronisieren, DBs legen Dokumente in Folder ...

Auf jeden Fall ist das dauernde Update des Folders (wozu überhaupt ? Aber irgendwie ist es ja eh undurchsichtig formuliert) nicht gerade performant.

Jedoch stellt sich die Frage: Muss die Routine überhaupt superperformant sein ? Soviele DBs habt Ihr ja bestimmt nicht (ein paar Tausend sind auch Pippifax), und die Abarbeitung ist sicherlich sowieso nicht zeitkritisch, also egal, ob nun 90 Sekunden oder 18,3 Sekunden ...

Bernhard

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
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.
sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
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
 
« Letzte Änderung: 29.10.05 - 13:17:37 von kennwort »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
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.

sagt Mark.



slowfood.de

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Dieses Posting hat Spaß gemacht. Schön das es intersubjektiv nachvollziehbar zu sein scheint.  :D
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.
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
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
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
	
« Letzte Änderung: 31.10.05 - 09:35:55 von mt69clp »
sagt Mark.



slowfood.de

Offline Mark³

  • Senior Mitglied
  • ****
  • Beiträge: 386
  • Geschlecht: Männlich
  • Nordisch by Nature
    • Das Leben aus der Sicht eines Menschen
Man könnte meinen, es ist sinnlos, Fragen zu stellen und sie sich selbst zu beantworten  :-X

Es hat aber durchaus Vorteile:

1. So spare ich mir ein eigenes Blog
2. Ihr habt was zu lesen
3. Ich habe das Gefühl, nicht allein auf der Welt zu sein  ;)
sagt Mark.



slowfood.de

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz