Domino 9 und frühere Versionen > ND8: Entwicklung
"Invalid file handle" bei Zugriff auf MIMEEntity
flaite:
Wenn du OutOfMemory bekommst, hast du einen verbotsmässig groben Fehler in deinem Anwendungs-Design.
zu 1) die Javareferenz belegt Speicher in der JVM. Das JNI gemanagte Objekt fast gar nicht im Sinne von unmerklich wenig.
zu 2) Hä? Notes-Objekte, auf die du recycle aufgerufen hast, kannst du nicht mehr verwenden.
Du rufst im doGet() oder doPost() von deinem Servlet NotesThread.sinitThread() (tendentiell am Anfang) und NotesThread.stermThread() am Ende. Du wirst kaum NotesObjekte in verschiedenen Threads sharen können. Mach alles was du mit Notes kommunizierst lokal in diesen Methoden.
Ich glaub Looseleaf hat so etwas wie einen ThreadPool für Notes-Objekte angeboten (http://tinyurl.com/5sa8el). Das ist allerdings für CORBA Verbindungen und nicht für local. Ausserdem hat mal jemand behauptet, es wäre buggy -> weiss nicht ob das stimmt.
Die Objekte der Notes-API sind einfach nicht thread safe. Deshalb geb ich deinen Versuchen sehr geringe Chancen auf Erfolg.
masseur81:
> zu 2) Hä? Notes-Objekte, auf die du recycle aufgerufen hast, kannst du nicht mehr verwenden.
Ich cache eigene Objekte, die eine Referenz auf das Document besitzen. Vor Verwendung des Documents wird aber geprüft, ob es noch gültig ist. Falls nicht, wird es neu ermittelt.
Mittlerweile verwende ich die Sessions pro Thread, speichere die Sessions in einem ThreadLocal.
flaite:
--- Zitat von: masseur81 am 21.08.08 - 16:16:40 ---Mittlerweile verwende ich die Sessions pro Thread, speichere die Sessions in einem ThreadLocal.
--- Ende Zitat ---
Und wenn du das machst, kannst du die Sessions und alle Notes-Objekte sowieso direkt lokal instantiieren und einfach überhaupt nix cachen.
Afaik kann eine Session mit einem NotesDocument (oder einem anderen NotesObjekt) nichts anfangen, wenn es nicht mit der gleichen Session instantiiert worden ist. Bin mir ziemlich sicher. Aber nicht 100%.
Die MemoryOutOfBound kommt vermutlich dadurch zustande, dass deine caches zu groß werden. Aber wie gesagt, ich würd erstmal gar nichts cachen. Vielleicht hat Ralf ja noch ein paar Performance-Tricks.
Ralf_M_Petter:
Lieber Masseeur81!
Für was schreibe ich mir hier die Fingerwund. Du darfst eine Session nicht über mehrere Aufrufe verwenden und du musst Sie unbedingt. Am Ende recyceln. Was man sich aber sparen kann, dass sind die sinitThread und stermThreads und zwar auf eine ganz einfache Weise. In jedem Servlet in dem du Notes verwendest, rufst du statt NotesThread.siniThread eine eigene statische Methode in einer eigens erstellten Klasse. In dieser Methode verwendest du eine statische hashmap in der du die ThreadIDs hinterlegst für die du notesThread.sinitThread schon gemacht hast.
Hinweis die teure Operation ist NotesThread.sinitThread und nicht das NotesFactory.createSession. Wir haben uns von der IBM einen Hook im WAS einbauen lassen, damit beim Beenden für jeden Thread ein stermThread aufgerufen wird, aber das verwenden wir nicht mehr, da wir von WAS auf Tomcat umgestiegen sind. Ist auch nicht nötig, wenn das ganze nicht lokal mit dem Dominoserver verbunden ist. Was ich sowieso nie mehr machen würde. Bei jedem kleinen Fehler hat man das Risiko, dass der Server abschmiert.
Grüße
Ralf
Ralf_M_Petter:
@Axel!
Er hat ja bereits gesehen, dass unsere Seite extrem schnell performt, aber er will ja keinen Code von sich zeigen, damit man es anschauen könnte wo er die Performance Probleme hat. Lokal habe ich Antwortzeiten die unter 0,7 Sekunden liegen für ganze Seiten wo wirklich jeder Text und auch alle on the fly Bilder aus einer Dominodatenbank gesaugt werden.
Und nochmal am Ende eines Servletsabrufs nicht die Session zu recyceln ist Selbstmord. Da man sicher irgendwo was zum recyceln übersieht oder ein Bug in Recycle ist und schon hat man das schönste Memory leak.
Grüße
Ralf
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln