Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

klassischer Artikel für Domino/Websphere Integration von B. Balaban

<< < (2/2)

Axel_Janssen:

--- Zitat von: Ralf_M_Petter am 31.07.03 - 08:12:50 ---Thread1 holt das Dokument z.B aus einer View. Thread2 macht kurz darauf das selbe und bekommt exakt das selbe Objekt. Thread1 ist fertig und recycelt das Objekt. Thread 2 crasht dann wenn er auf das Objekt zugreifen will, da es ja bereits recycelt ist.

--- Ende Zitat ---

Hallo Ralf,

"exakt das selbe Objekt" stimmt mich nachdenklich. Das ist möglicherweise der Punkt. Die Documents sind vermutlich als Collection im Database-Object. Das Database-Objekt ist ja - wie man an den Initialisierungszeiten-Messungen sieht - ein sehr großes Objekt-. Wenn jetzt -wie es meine Idee war - das Database-Object zwischen verschiedenen (User-)Threads in doPost() und doGet() geshared wird, dann wird das wahrscheinlich die Ursache sein.

In Single-User Swing Anwendungen tritt diese Situation einfach nicht auf. Da kann das Database-Objekt von verschiedenen Aufrufen geshared werden.
Meine Swing-App funktioniert ja so:
+ Initialisierung:
-> hole Session, Database, View. Speichere diese in Instanzvariablen.
+ Aufruf 1: hole Collection, hole Documents, recycle Collection
+ Aufruf 2: hole Collection, hole Documents, recycle Collection.
+ [...]
+ Aufruf 2: hole Collection, hole Documents, recycle Collection.
-> recycle Session (und damit alles andere)

Das ist sauber.
Bei Multi-User Servlets greifen aber mehrere User synchron auf die gleichen Document-Objekte zu, wenn das Database-Objekt geshared wird.
Wird das Database bei jedem User-Thread (doXXX) neu erzeugt, wird nicht auf den gleichen Document-Objects gearbeitet, bei gesharter Database aber schon.

hoffe ich habe mich einigermaßen klar ausgedrückt

Gruß Axel

Ralf_M_Petter:
Die Performance des direkten Zugriffs verglichen mit dem Corba Zugriff ist trotz des Caching der Session und des Database Objekts viel besser. Habe es anhand unserer Homepage überprüft. Zumindest auf unserer Maschine ist Corba sehr langsam. Wenn du zu anderen Ergebnissen kommst, wäre ich natürlich sehr daran interessiert.


Grüße

Ralf

Axel_Janssen:
Objekte, die über die gleiche NotesSession geholt werden, sind in der Tat identisch. Objekte, die über verschiedene NotesSessions geholt werden nicht.
Hier ist der Beweis:


--- Code: ---/*
 * ExploreNotesObjectSharing.java
 *
 * Created on 31. Juli 2003, 09:38
 */

package de.aja.db;

import lotus.domino.*;
/**
 *
 * @author  Axel
 */
public class ExploreNotesObjectSharing {
   
    /** Creates a new instance of ExploreNotesObjectSharing */
    public ExploreNotesObjectSharing() {
    }
   
    public static void main (String [] args) {
           
            NotesThread.sinitThread();
            // shared Objects.
            try {
            // 1. Shared View
            Session nSessionShared = NotesFactory.createSessionWithFullAccess("kennwort");
            Database nDbShared = nSessionShared.getDatabase ("localhost", "test.nsf");
            View nViewShared = nDbShared.getView("V_MP");
            Document docSharedA = nViewShared.getFirstDocument();
            Document docSharedB = nViewShared.getFirstDocument();
           
            System.out.println("shared view");
            System.out.println("docSharedA.equals(docSharedB))"+ docSharedA.equals (docSharedB) );
            System.out.println("docSharedA.hashCode()" + docSharedA.hashCode());
            System.out.println("docSharedB.hashCode()" + docSharedB.hashCode());
           
            // 2. 1 level up: Shared Database
            View nViewSharedB = nDbShared.getView("V_MP");
            Document docSharedC = nViewSharedB.getFirstDocument();
            System.out.println("shared Database");
            System.out.println("docSharedA.equals(docSharedC))"+ docSharedA.equals (docSharedC) );
            System.out.println("docSharedA.hashCode()" + docSharedA.hashCode());
            System.out.println("docSharedC.hashCode()" + docSharedC.hashCode());
           
            // 3. 1 level up: Shared Session
           
            Database nDbSharedB = nSessionShared.getDatabase ("localhost", "test.nsf");
            View nViewSharedC = nDbShared.getView("V_MP");
            Document docSharedD = nViewSharedC.getFirstDocument();
            System.out.println("shared Session");
            System.out.println("docSharedA.equals(docSharedD))"+ docSharedA.equals (docSharedD) );
            System.out.println("docSharedA.hashCode()" + docSharedA.hashCode());
            System.out.println("docSharedD.hashCode()" + docSharedD.hashCode());
           
           
            // 4. Share nothing
           Session nSessionNonSharedA = NotesFactory.createSessionWithFullAccess("kennwort");
            Database nDbNonSharedA = nSessionNonSharedA.getDatabase ("localhost", "test.nsf");
            View nViewNonSharedA = nDbNonSharedA.getView("V_MP");
            Document docNonSharedA = nViewNonSharedA.getFirstDocument();
           
            Session nSessionNonSharedB = NotesFactory.createSessionWithFullAccess("kennwort");
            Database nDbNonSharedB = nSessionNonSharedB.getDatabase ("localhost", "test.nsf");
            View nViewNonSharedB = nDbNonSharedB.getView("V_MP");
            Document docNonSharedB = nViewNonSharedB.getFirstDocument();
           
            System.out.println("Share nothing");
            System.out.println("docNonSharedA.equals(docNonSharedB))"+ docNonSharedA.equals (docNonSharedB) );
            System.out.println("docNonSharedA.hashCode()" + docNonSharedA.hashCode());
            System.out.println("docNonSharedB.hashCode()" + docNonSharedB.hashCode());
            nSessionShared.recycle();
            nSessionNonSharedA.recycle();
            nSessionNonSharedB.recycle();
           
            } catch (Exception e) {e.printStackTrace(); }
            NotesThread.sinitThread();
       
    }
   
}

--- Ende Code ---

output:

--- Code: ---shared view
docSharedA.equals(docSharedB))true
docSharedA.hashCode()27379847
docSharedB.hashCode()27379847
shared Database
docSharedA.equals(docSharedC))true
docSharedA.hashCode()27379847
docSharedC.hashCode()27379847
shared Session
docSharedA.equals(docSharedD))true
docSharedA.hashCode()27379847
docSharedD.hashCode()27379847
Share nothing
docNonSharedA.equals(docNonSharedB))false
docNonSharedA.hashCode()7615385
docNonSharedB.hashCode()15184449

--- Ende Code ---

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln