Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino
object has been removed or recycled
flaite:
Hi,
das Problem muß irgendwo anders liegen. Ich vermute auch, dass bei Frage 1) eine Abfrage db.isOpen() auf das entsprechende Datenbankobjekt false zurückgibt.
Die Notes Java Api ist da an vielen Stellen nicht besonders transparent. Das Interface wurde irgendwann 1998 designed. Heute würden da viele Sachen klarer gemacht.
In dem Scope, in dem du versuchst auf das Datenbankobjekt zuzugreifen, ist es (aus irgendwelchen Gründen) nicht referenziert.
Sieht für mich fast so aus, dass du irgendwo eine lokale Variable benutzt hast, wo du glaubst eine Instanzvariable zu benutzen.
Kommt z.B. so zuStande:
private Database myDatabase;
--- Code: ---public void setDb (Database myDatabase) {
myDatabase = myDatabase;
}
--- Ende Code ---
stattdessen:
--- Code: ---public void setDb (Database myDatabase) {
this.myDatabase = myDatabase;
}
--- Ende Code ---
ODER UND WESENTLICH WAHRSCHEINLICHER: wenn du das gleiche DB Objekt benutzen willst, muß das Session Objekt, mit der das ursprüngliche DB Objekt geholt worden ist bei weiteren calls auch benutzt werden.
Ich bin mir ziemlich sicher, dass deine Probleme von Remote-calls und local calls die gleiche Ursache haben, auch wenn sie sich unterschiedlich manifestieren.
Ich glaub sogar, dass dein Problem eigentlich die gleichen Ursachen hat wie die "stateless-not-enough" von Gavin King gegen Spring, aber das krieg ich nicht so nebenbei erklärt.
IMNSHO scheinen die Probleme daringehend begründet zu sein, dass dir der Lebenszyklus der von dir verwendeten Objekte nicht wirklich klar ist.
Ich glaub das Buch ist gut, kenne es aber nicht. 50 Euro für ein Buch, dass sich nur mit einer Api beschäftigt, finde ich viel Geld.
Gruß Axel
Ralf_M_Petter:
Hallo Exratt!
Meiner Meinung nach kann dein Code nicht funktionieren, da du kein NotesThread.sinit() in deinem Code hast. Wo initialisierst du denn den Event Handler Thread?
Bei neueren Programmen von mir bin ich übrigens ganz davon weggegangen, im Event Handler Thread Zugriffe auf das Domino API zu machen, da dass einfach zuviele Probleme macht. Die Zugriffe auf Domino mache ich ausschliess in einem eigenen Thread, der dann die Ergebnisse mit InvokeLater wieder an den EventHandler Thread zurückgibt.
Grüße
Ralf
exratt:
danke für die zahlreichen antworten :)
--- Zitat von: Axel Janssen am 18.09.06 - 13:45:35 ---Ich vermute auch, dass bei Frage 1) eine Abfrage db.isOpen() auf das entsprechende Datenbankobjekt false zurückgibt.
--- Ende Zitat ---
richtig vermutet. beim anschließenden db.open() bekomm ich die exception.
--- Zitat von: Axel Janssen am 18.09.06 - 13:45:35 ---ODER UND WESENTLICH WAHRSCHEINLICHER: wenn du das gleiche DB Objekt benutzen willst, muß das Session Objekt, mit der das ursprüngliche DB Objekt geholt worden ist bei weiteren calls auch benutzt werden.
--- Ende Zitat ---
die weiteren calls mache ich aber direkt auf dem database-objekt. die session interessiert mich in dem fall ja gar nicht, da ich weder eine neue eröffne, noch mir die alte geben lasse.
--- Zitat von: Axel Janssen am 18.09.06 - 13:45:35 ---IMNSHO scheinen die Probleme daringehend begründet zu sein, dass dir der Lebenszyklus der von dir verwendeten Objekte nicht wirklich klar ist.
--- Ende Zitat ---
gut möglich. daher die idee mit dem buch ;)
--- Zitat von: Ralf_M_Petter am 18.09.06 - 13:50:29 ---Meiner Meinung nach kann dein Code nicht funktionieren, da du kein NotesThread.sinit() in deinem Code hast. Wo initialisierst du denn den Event Handler Thread?
--- Ende Zitat ---
ich habe kein NotesThread.sinit(), da es bei remote-calls über corba laut hilfe nicht nötig ist.
--- Zitat ---An application that makes remote calls does not use the NotesThread class.
--- Ende Zitat ---
--- Zitat von: Ralf_M_Petter am 18.09.06 - 13:50:29 ---Bei neueren Programmen von mir bin ich übrigens ganz davon weggegangen, im Event Handler Thread Zugriffe auf das Domino API zu machen, da dass einfach zuviele Probleme macht. Die Zugriffe auf Domino mache ich ausschliess in einem eigenen Thread, der dann die Ergebnisse mit InvokeLater wieder an den EventHandler Thread zurückgibt.
--- Ende Zitat ---
uhm. klingt interessant. hab mich aber noch nicht eingehend mit threads beschäftigt, so dass mir das invokelater auch nicht ganz geläufig ist. hab das irgendwann letztens zum ersten mal gelesen ;) evtl kannst du mir ja ein kleines beispiel reinhauen, aber unabhängig davon kann ich mich ja mal informieren.
zum verständnis nochmal kurz eine erläuterung, was genau mein test-programm macht (bastel nämlich erstmal nur rum, um mich mit der api vertraut zu machen und schon einigen problemen zu begegnen, damit ich im richtigen einsatz dann besser vorran komme):
ich habe eine art browser, der mir informationen zu allen datenbanken anzeigt. links habe ich einen jtree, wurzel ist ein dbdirectory, darunter alle darin enthaltene datenbanken, darunter die views und darunter dann die dokumente. rechts neben dem baum sieht man dann informationen zum jeweils angeklickten element. da es ewig dauert (5-10 minuten), den baum beim initialisieren gleich komplett zu füllen, mache ich das dynamisch, wenn ein node expandiert wird. jeder node speichert sein eigenes objekt (also ein databasenode eben das database-objekt) und bastelt sich, wenn ein TreeExpansionEvent auftritt, die kindelemente selber zusammen, indem es auf das userobjekt zurückgreift. genauso bekommt auch das info-panel dieses userobjekt, wenn es informationen darüber anzeigen soll. immer dann knallt es eben, weil event-handling in einem eigenen thread ist und der das objekt nicht kennen will oder so...
Ralf_M_Petter:
Hallo exratt!
Habe jetzt deine Postinges nochmal gelesen und in deinem 2. Posting schreibst du dass du im Constructor des Frames ein sinitThread machst. Daraus habe ich geschlossen du verwendest den lokalen Zugriff.
Grundsätzlich: Bitte Schreibe ohne fundiertes Wissen über Threading keine Swing Programme. Leider programmieren sehr viele Leute Swing Programme ohne das Konzept von Threads verstanden zu haben. Daraus resultiert der schlechte Ruf (Performance) von Swing Programmen.
Eines Noch: Niemals ich wiederhole Niemals von einem anderen Thread als der Eventhandler Thread auf ein Swing Objekt zugreifen. Zu dieser Regel gab es früher Ausnahmen mittlerweile aber nicht mehr. Wenn man Mainpulationen aus anderen Threads machen will ist immer InvokeLater zu verwenden!!!!!!
Grüße
Ralf
exratt:
ja, anfangs hatte ich ein ähnliches problem mit den lokalen zugriffen. letztendlich (und mit einsatz von sinitThread und stermThread) hat es aber geklappt und ich wollte das gleiche programm mit remote-calls ausprobieren (habe in dem fall die notes-thread-geschichten rausgenommen).
jedenfalls werd ich mir nun erstmal ein paar sachen zu swing und threads anlesen, hab zwar schon vor jahren swing-kram gebastelt, aber nicht gewusst, dass man da aufpassen muss (mal abgesehen davon, dass man immer liest, swing sei nicht thread-sicher, aber das hängt bestimmt damit zusammen)
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln