Autor Thema: Arbeitsweise von CSIViewPart  (Gelesen 3275 mal)

Offline Felix Ziegler

  • Aktives Mitglied
  • ***
  • Beiträge: 122
Arbeitsweise von CSIViewPart
« am: 02.03.09 - 13:43:46 »
Hallo zusammen,

ich bin mir nicht ganz sicher in welchen Bereich dieser Beitrag gehört. Wenn er doch besser im Java Bereich aufgehoben ist, dann bitte dort hin verschieben...

Ansichten und Ordner in der Maildatenbank werden im 8.5er Client als Java CSIViewPart Ansichten dargestellt. Ich möchte gerne wissen wie diese CSIViewPart Klasse im Hintergrund arbeitet. Genauer gesagt interessiert mich der Teil, wie die Daten aus der Notesdatenbank gezogen werden.

Alle Versuche Daten in einer "normalen" (ViewPart) Ansicht darzustellen, sind um ein vielfaches langsamer. Der Unterschied liegt bei 2500 Dokumenten bei ca. 10 - 15 Sekunden.

Ich bin für jeden Tipp dankbar, da ich nicht weiß, nach was ich das Internet noch abgrasen soll ;-)

Beste Grüße und Danke schonmal,
Felix


Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Arbeitsweise von CSIViewPart
« Antwort #1 am: 02.03.09 - 13:59:21 »
Deine Infos sind zwar mehr wie dürftig, aber ich rate mal Du verwendest keine virtuellen Tabellen oder?

Lies dir einfach mal folgenden Link http://publicobject.com/glazedlists/documentation/swt_virtual_tables.html durch, dann sollten Performance Probleme bei grossen Tabellen der Vergangheit angehören. Die Umsetzung in Notes ist aber dann immer noch etwas tricky, aber da sage ich nur was dazu wenn du mehr über dein Problem postest.

Grüße


Ralf

P.S. Zur genauen Implementation der ViewParts in Notes wirst du wenig Infos bekommen, da dass Closed Source ist. Man kann aber diese ViewParts auch in eigenen Applikationen verwenden. Wie das geht, steht in einem Tutorial auf developerworks.
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline Felix Ziegler

  • Aktives Mitglied
  • ***
  • Beiträge: 122
Re: Arbeitsweise von CSIViewPart
« Antwort #2 am: 02.03.09 - 14:35:29 »
Hallo Ralf,

danke erstmal. Ich habe schon von virtuellen Tabellen gehört. Verwende sie aber noch nicht. Hast gut geraten ;-)

Aber da liegt mein Problem leider nicht. Mein Problem ist das holen der Daten aus Notes für die anschließende Tabelle.

Im Artikel http://www.ibm.com/developerworks/lotus/library/notes8-eclipse-comp/ ist folgender Code-Schnippsel aufgeführt:

Code
public class CalculateData implements Runnable 
{
	public void run() 
	{
		try {
			Session ssn = NotesFactory.createSessionWithFullAccess();
			...
			ssn.recycle();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void execute() {
        NotesThread nt = new NotesThread(this);
        nt.start();
	}
}

Mit diesem Code greife ich auf die Datenbank und Ansicht zu. Anschließend bleibt mir nichts anderes übrig, als die Dokumente über View.GetFirstDocument / .GetNextDocument zu durchlaufen oder mir eine Collection zu ziehen und diese dann zu durchlaufen.
Und das kostet Zeit... massig Zeit.

Deshalb interessiert mich die Arbeitsweise der CSIViewPart Klasse. Die Inbox schafft es ja auch tausende von Dokumenten im Millisekunden Bereich darzustellen ;-) Aber wie???

Meinst du das Tutorial auf developersworks bei dem einfach die URL in den Eigenschaften der Komponente ausgetauscht wird?

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Arbeitsweise von CSIViewPart
« Antwort #3 am: 02.03.09 - 14:58:01 »
Der Schmäh der virtuellen Tabellen ist eben genau, dass du nicht alle Dokumente beim ersten Anzeigen der Tabelle holst, sondern immer nur diese die du momentan in der View siehst. Bei Bedarf wird dann der Rest nachgeladen. Ich denke mal genauso macht es auch Lotus. Dadurch wird deine Ansicht innerhalb von ms geladen, weil nur die Anzahl an Dokumenten geholt wird, die derzeit am Bildschirm Platz haben.

Aber nochetwas zu deinem Code. Die Erzeugung eines NotesThreads ist ein sehr teurer Prozess und sollte daher so selten wie möglich gemacht werden. Eventuell kannst du überlegen, den NotesThread in einer Endlosschleife laufen zu lassen in der du dann beliebigen Code ausführen kannst. So endlich wie es ein Serlet Container macht. Erfordert natürlich ein wenig wissen über die Programmierung von MultiThreading Anwendungen. Wenn man es aber mal hat, dann geht es ziemlich gut.

Aber das wird in deinem Fall eher nur der kleinere Performancevorteil sein. Den grössten wirst du sicher haben, wenn du die Daten gar nicht erst liest.. Du kannst das übrigens auch daran schön sehen, dass die Notes eigenen Views die Daten immer dynamisch nachladen, dass wenn du in der View scrollst ab und zu links unten der Blitz erscheint, der anzeigt, dass neue Daten geladen werden. Also setz virtuelle Tabellen ein und wenn du nicht dein eigenes Sorting oder Filtering brauchst, wirst du begeistert sein.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline Felix Ziegler

  • Aktives Mitglied
  • ***
  • Beiträge: 122
Re: Arbeitsweise von CSIViewPart
« Antwort #4 am: 02.03.09 - 15:20:55 »
Danke für die ganzen Infos. Das mit dem Nachladen stimmt. Wenn man viel hin und her scrolled, dann merkt mans...

Ich hab keine Ahnung von MultiThreading Anwendungen. Aber ich werd mich mal einlesen in die Thematik...

Aber was meinst du mit
Zitat
Den grössten wirst du sicher haben, wenn du die Daten gar nicht erst liest..
Ich muss der Tabelle doch mitteilen, wass sie anzeigen soll, oder etwa nicht?

Filtern und sortieren kommt im nächsten Schritt. Jetzt möcht ich erst mal was (schnell) angezeigt bekommen ;-)

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Arbeitsweise von CSIViewPart
« Antwort #5 am: 02.03.09 - 15:26:16 »
Damit meinte ich, dass du von 20.000 die meisten gar nicht liest und das sollte den grössten Performancesprung bringen. Problematisch wird es wenn du filtern bzw. Sortieren willst. Denn für sortieren solltest du ja die ganze View geladen haben. Lotus verwendet hier meiner Meinung nach undokumentierte Features des Java APIs um Views nach verschiedenen Sortierungen auszulesen. Wie das geht wüsste ich selber gerne.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Arbeitsweise von CSIViewPart
« Antwort #6 am: 02.03.09 - 15:29:02 »

Ich muss der Tabelle doch mitteilen, wass sie anzeigen soll, oder etwa nicht?



Nein musst du nicht, bei virtuellen Tabellen sagtst du nur wie groß die Tabelle sein soll und implementierst einen Callback Listener den die Tabelle aufruft, wenn es für die Darstellung einer Zeile Daten braucht.

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline Felix Ziegler

  • Aktives Mitglied
  • ***
  • Beiträge: 122
Re: Arbeitsweise von CSIViewPart
« Antwort #7 am: 02.03.09 - 15:31:41 »
Ach so hast dus gemeint... Der Ansatz ist genial... Mal sehen ob ichs hin bekomm.

Wenn ich das sortieren auch noch geschafft hab, dann sag ich dir bescheid :D

Danke dir und noch nen schönen Nachmittag/Abend!

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Arbeitsweise von CSIViewPart
« Antwort #8 am: 09.03.09 - 17:05:42 »
Felix hat mir ein paar Fragen in einer PM gesendet, die Antworten möchte ich aber lieber im öffentlichen Bereich geben, da ich denke die Antworten sind für mehr Leute interessant.

Erst mal die erste Frage:

Wie schafft man es die Notesarbeit in einen eigenen Thread auszulagern ohne dass man in dem Backgroundthread immer wieder für Notes initialisieren muß.

Ich habe es so gelöst, dass ich zuerst ein Interface (NotesWork) erstellt habe mit einer Methode run(Session ses);

Weiters habe ich eine Klasse (NotesWorkerThread)  erstellt die von der Klasse Thread erbt. In dieser Klasse habe ich in der Run Methode die beim Thread start aufgerufen wird, zuerst dass Notes Environment initialisiert und dann eine Endlosschleife programmiert. In dieser Schleife wird immer eine LinkedList überprüft, ob Sie Objekte enthält, wenn ja wird das älteste Objekt, dass die Schnittstelle NotesWork implementieren muß geholt und die Methode run ausgeführt. Wenn die Methode run fertig ist, habe ich die Session recycelt und eine neue erstell und warte wieder auf einen Eintrag in der LinkedList.

So laufen alle Zugriffe auf Notes in einen eigenen Thread und man blockiert nicht den Eventloop Thread des Guis.

Ich habe das ganze bei uns dann noch so erweitert, dass man eine beliebige Anzahl von NotesWorkerThread laufen lassen kann, die über eine eigene Klasse als Threadpool verwaltet werden. Die kümmert sich dann auch um die Generierung der Threads und eventuell der Vernichtung falls ein Thread auf einen Fehler stosst.

Um optimale Performance in Felix Fall zu erreichen, müsste man dann auf die Allgemeine Gültigkeit der Klassen verzichten und das Interface eventuell so gestalten, dass statt der Session eine View übergeben wird. Dann darf natürlich die Session nicht recycelt werden. Bitte dann aber unbedingt gewährleisten, dass immer alle Objekte die nicht mehr benötigt werden recycelt werden, da man sich sonst ganz fiese Memory Leaks einhandelt.

Wenn man Daten aus dem NotesThread an das Gui übergeben will, muß man natürlich mit Display.asyncExec arbeiten.

@Felix Versuch mal das Konzept umzusetzen und Posten dann deinen aktuellen Source, dann kann ich dir bei der Implementierung der Callbacks helfen. Ich habe meine virtuellen Tabellen in meiner RCP schon fertig und sie performen wirklich gut.  Die Antwortzeiten bei der Erstellung der View sind von mehreren Sekunden auf Millisekunden verbessert worden. Es zahlt sich also aus.

Grüße

Ralf
 
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz