Autor Thema: Zugriff auf Dokumente in der DocumentCollection crasht Domino Designer  (Gelesen 3451 mal)

Offline andresku

  • Frischling
  • *
  • Beiträge: 4
Hallo,

in der folgenden einfachen Methode eines Java-Agenten möchte ich die Dokumente einer Collection in ein TreeMap speichern und zurückgeben. Der Schlüssel für den späteren Zugriff auf Dokumente soll die eMail-Adresse der Person darstellen:
   
Code
        
private TreeMap<String, Document> getLNcontacts (String notesServer, String notesDB)
	{
		TreeMap<String, Document> mPersons = new TreeMap<String, Document>();

		try {
			Database db = getSession().getDatabase(notesServer, notesDB, false);
			DocumentCollection dc = db.search("SELECT Type = \"Person\"");
			
            Document currDoc = dc.getLastDocument();
            while (currDoc != null)
            {
            	if (!currDoc.isDeleted() && currDoc.isValid()) {
					String key = currDoc.getItemValueString("InternetAddress").toLowerCase();
(*)	            	mPersons.put(key, currDoc);
		        }
                currDoc = dc.getPrevDocument();
            }
 
		} catch (Exception e) {
			e.printStackTrace(pwLog);
		}
		return mPersons;
	}

Die Collection "dc" enthält ca. 37 Tausend Dokumente. Wenn ich den Agenten testweise laufen lasse, stürzt der Designer nach einigen Tausend Dokumenten komplett ab und erzeugt ein Eclipse-Coredump. Die Absturzstelle (Dokument bei dem es passiert) ist jedesmal unterschiedlich. Kommentiere ich die mit (*) markierte Zeile aus, läuft das Programm durch (tut aber natürlich weiter nichts, da mir die Daten fehlen). Schreibe ich in den TreeMap ein zuvor erzeugtes Dummy-Dokument, läuft die Methode auch durch. Es ist eindeutig das Problem des Zugriffs auf das sich aktuell im Zugfiff befindene Dokument (hier: currDoc).

Fällt hier jemadem ein Programmierfehler auf?

Danke für eure Unterstützung.

Andreas

Offline DominoDancing

  • Aktives Mitglied
  • ***
  • Beiträge: 141
  • Geschlecht: Männlich
  • Kugel im Käfig, lsmf, hurz ...
Hallo Andreas,

... das sieht für mich erstmal schlüssig aus. Hast Du mal versucht, den Agent bei geschlossenem Designer zu starten?

Liebe Grüße
René
... ich fühl' mich so ... Regenbogen ... ;D
... man muss die Ursache des Problems finden ... oder eine Tüte Glitzerfeenstaub ...
... Ich bin rhythm, I'm a dancer und I don't like Influenzer ...

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Moin
Da dürfte der Speicher wohl knapp werden.... Versuch mal über die Documentcollection zu loopen ohne korrektes Recycle...
Versuch doch anstatt der Notes Objekte einfach die UNID in der TreeMap zu speichern.
Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline andresku

  • Frischling
  • *
  • Beiträge: 4
Hallo,

vielen Dank für eure Antworten. Ich habe 2 folgende Änderungen eingeführt:
1. Jedes Dokument wird nach dem "Verwenden" gleich freigegeben (recycle()).
2. von jedem Objekt hole ich mir nicht den Verweis auf's "Document", sondern die NotesID (um später darauf zugreifen zu können), da nach dem recycle ist der jeveilige Verweis nicht mehr gültig.


Code
private TreeMap<String, String> getLNcontacts (String notesServer, String notesDB)
{
	TreeMap<String, String> mPersonId = new TreeMap<String, String>();

	try {
		Database db = getSession().getDatabase(notesServer, notesDB, false);
		DocumentCollection dc = db.search("SELECT Type = \"Person\"");
		writeLog("DB-select liefert: " + dc.getCount() + " dokumente");

		Document tmpdoc;
		Document doc = dc.getFirstDocument();
		int i = 1;
		while (doc != null) {				
			if (!doc.isDeleted() && doc.isValid()) {
				Vector itVal = doc.getItemValue("InternetAddress");
				if (itVal != null && !itVal.isEmpty()) {
					if (itVal.get(0).toString().length() > 5 ) {
						String key = itVal.get(0).toString().toLowerCase();
						if (mPersonId.get(key) == null)
							mPersonId.put(key, doc.getNoteID());
					}
				}
			}
			if (i%1000 == 0) {
				writeLog("... und wieder ein Tausend: " + i%1000);
				i++;
			}		
			// dieses komische Konstrukt wird von IBM empfohlen
			tmpdoc = dc.getNextDocument();
			doc.recycle();
			doc = tmpdoc;
		}
		// recycle überall...
		dc.recycle();
		db.recycle();
	} catch (Exception e) {
		e.printStackTrace(pwLog);
	}
	return mPersonId;
}

Nun läuft das Programm durch. Ist leider aber sehr langsam. recycle() scheint sehr zeitintensiv zu sein.
Noch einmal vielen Dank für eure Hilfe.

Andreas

Offline umi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.062
  • Geschlecht: Männlich
  • one notes to rule'em all, one notes to find'em....
    • Belsoft AG
Andere Frage:
Wenn der Zugriff auf die Dokumente eh über die Email Adresse geht, warum nicht einfach die benötigten Dokumente über die $Users View holen?


Gruss

Urs

<:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Jegliche Schreibfehler sind unpeabischigt
http://www.belsoft.ch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~:>

Offline andresku

  • Frischling
  • *
  • Beiträge: 4
Ursprünglich habe ich die Dokumente auch über eine View selektiert /(MailAddress)/. Da ich aber die gleichen, o. beschriebenen, Probleme hatte, habe ich eben über db.search() versucht.

Btw. - in der DB (in der Applikation) gibt es den einzigen Dokumententyp (Form = "Person"). Eine spezielle Ansicht zeigt firmenexterne Kontakte, die automatisch aus SAP generiert/upgedatet werden.

Die Ansichtsauswahl der View $Users /SELECT (Type = "Person" : "LoginUser" : "Certifier" : "Database" ) | (Type="Group" & (@IsUnavailable ( GroupType )| (GroupType = "0":"1")))/ wäre somit auch ausreichend. Das Problem lag bekannterweise woanders.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz