Domino 9 und frühere Versionen > ND8: Entwicklung

"Invalid file handle" bei Zugriff auf MIMEEntity

<< < (2/5) > >>

Ralf_M_Petter:
Aber du kommst durch das Recycle in Teufelküche wenn du ein Session Objekt verwendest. Du bekommst nämlich dann immer die selben C++ Objekte.

Wenn jetzt dann in dem einen Thread das Objekt recycelt wird, dann bekommst du im anderen Thread plötzlich ganz komische Fehlermeldungen. Eventuell sogar solche wie du bekommst. Aber ohne Code kann man das natürlich nicht beurteilen.

Hier noch ein Auszug aus der Doku als Beleg:

If you create more than one object to represent the same Domino element, recycling one recycles all. For example:
View v1 = db.getView("All");
View v2 = db.getView("All");
v1.recycle(); // also recycles v2
Results are undefined if you attempt to use a recycled object. No error is guaranteed.

Übrigens ich empfehle bei Verwendung des Domino APIs in Servlets unbedingt am Ende des Servlets die Session zu recyceln, da man sonst unter Garantie Memoryleaks zusammenzimmert, auch wenn man noch so aufpasst.

Grüße

Ralf

masseur81:
Was heißt "am Ende des Servlets"? Am Ende eines Requests oder beim Zerstören des Servlets am Ende der Applikation?
Wenn ich aber am Ende des Requests ein Session.recycle() aufrufe, dann muss ich mich bei jedem Request neu verbinden (Performance), muss dann auch zwischen den Requests synchronisieren.

Also momentan ist es so:
1. Ich erzeuge die Session in einem beliebigen Thread und nutze diese in allen anderen mit.
2. Ich rufe NotesThread.sinitThread() NUR vor dem Sessionaufbau auf, also nicht explizit in jedem Thread. Trotzdem kann ich auf diese Objekte in anderen Threads zugreifen. Ein Aufruf in jedem Thread ist hier auch schwierig, da die Threads vom WebContainer verwaltet werden (ThreadPool).
3. Wenn ich (aus Versehen) ein Objekte recycle, obwohl ein anderer das noch nutzt, dann lade ich das Dokument wieder aus der Datenbank. Ich erreiche das durch Kapselung und entsprechende Abfragen.

Bisher läuft das auch ganz gut, aber wie gesagt, diese Meldung beim Zugriff auf MIMEEntities ist das einzig störende bisher.

Ralf_M_Petter:
Deine Vorgehendsweise ist Grundfalsch und sicher der Grund warum es nicht funktioniert.

Du MUSST jeden Thread in dem du Domino Objekte lokal verwenden willst NotesThread.sinitThread aufrufen. Du sollst am Ende eines Requests die Session recyceln. Übrigens Eine Session ist sehr schnell wieder da. Das aufwendige ist das NotesThread.sinitThread. Auf unserer Homepage wird es genauso gemacht. Alle unsere Seiten sind komplett dynamisch. Alle Bilder werden dynamisch aus einer Dominodatenbank geladen und auch alle Texte sind variabel und kommen aus einer Domino Datenbank. Du kannst ja mal die Performance testen http://www.artweger.at

Grüße

Ralf

flaite:
Vielleicht wird das MIMEEntity Objekt irgendwo in der Session gecached und dann benutzen 2 Threads die gleichen von dem Objekt gemanagten Ressourcen.
Um solchen echt nervigen Problemen aus dem Weg zu gehen, würd ich Ralfs Vorschlag in jedem Fall folgen.
Du siehst dann ja, ob die Session-per-Request-Strategie wirklich merkliche Performance-Nachteile mit sich bringt.

masseur81:
Okay, also die Performance ist bei mir nicht so gut. Aber ich teste das mal, indem ich die Initialisierungen und Session-Recycling über einen Filter in die Hand nehme.

Im Übrigen noch die Empfehlung bei deiner Seite, den Content-Type-Header bei den Bildern zu setzen, z.B: beim Aufruf von http://www.artweger.at/app1/Image?link=4A421A6B3605745DC1256C6700430AFE&ti=67493717

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln