Ich habe bis jetzt die Zugriffe mit init und Term geklammert, habe aber die Objekte wie Session und Database trotzdem wieder verwendet.
Genau das funktioniert bei mir nämlich nicht.
Ich bekomme eine NotesException Object has been removed or recycled.
Hier ist code (mit dem das JTableModel kommuniziert):
A. Konstruktor (wird selbstverständlich zuerst aufgerufen).
private NotesConnection(HashMap appletParameters) {
//System.out.println("appletParameters=" + appletParameters);
serverName = (String) appletParameters.get("dbServerName");
serverPath = (String) appletParameters.get("dbPathName");
this.serverName = serverName;
this.serverPath = serverPath;
try {
NotesThread.sinitThread();
// die ganzen Objekte werden in Instanzvariablen gecasht.
nSession = NotesFactory.createSessionWithFullAccess();
nDbCurrent = nSession.getDatabase (serverName, serverPath);
nViewMAs = nDbCurrent.getView("V_MP");
testDoc = nViewMAs.getFirstDocument();
nViewEntriesByWeek = nDbCurrent.getView("EntriesByWeek2");
System.out.println("neueste");
} catch(Exception e) {
e.printStackTrace();
}
finally {
NotesThread.stermThread();
}
Methode, die immer wieder aufgerufen wird:
public String[][] getMAsData (int week, int year) {
Vector vecMAs = new Vector();
if ((week == lastWeek) && (year == lastYear)) return arResult;
DocumentCollection nColMAs = null;
DocumentCollection nColEntriesByWeek = null;
try {
NotesThread.sinitThread();
// BEREITS IN DER NÄCHSTEN ZEILE ERHALTE ICH DIE OBEN ANGESPROCHENE EXCEPTION
System.out.println(testDoc.getItemValueString("userNameAbb"));
nColMAs = nViewMAs.getAllDocumentsByKey("doc");
int colCount = nColMAs.getCount();
int expectedUsers = (int) (100*(1/0.75));
HashMap userNamesIndex = new HashMap(expectedUsers);
String arResult [][] = new String [colCount][7];
Document nDoc = null;
int i = 0;
nDoc = nViewMAs.getFirstDocument();
while (nDoc != null) {
String user = nDoc.getItemValueString("userNameAbb");
userNamesIndex.put(user, new Integer(i));
arResult[i][0] = user;
i +=1;
nDoc = nViewMAs.getNextDocument(nDoc);
}
Document nDocWeek = null;
/*
Vector key = new Vector();
key.add(new Integer(2003));
key.add(new Integer(28));
*/
String key = year + "-" + week;
nColEntriesByWeek = nViewEntriesByWeek.getAllDocumentsByKey(key);
//System.out.println("count=" + nColEntriesByWeek.getCount());
nDocWeek = nColEntriesByWeek.getFirstDocument();
while (nDocWeek != null) {
int datum = nDocWeek.getItemValueInteger("Datum");
int tagInWoche = nDocWeek.getItemValueInteger("TagInWoche");
String userName = nDocWeek.getItemValueString("KUserNameAbb");
//System.out.println("datum=" + datum + ",tagInWoche=" + tagInWoche + ",userName=" + userName);
//System.out.println("userNamesIndex=" + userNamesIndex);
int userIndex = ((Integer)userNamesIndex.get(userName)).intValue();
arResult [userIndex][tagInWoche] = "x";
nDocWeek = nColEntriesByWeek.getNextDocument(nDocWeek);
}
return arResult;
} catch(Exception e) {
e.printStackTrace();
return null;
}
finally {
try {
if (nColMAs != null) {
nColMAs.recycle();
nColMAs = null;
}
if (nColEntriesByWeek != null) {
nColEntriesByWeek.recycle();
nColEntriesByWeek = null;
}
} catch (Exception e) {e.printStackTrace(); }
NotesThread.stermThread();
lastWeek = week;
lastYear = year;
this.arResult = arResult;
return null;
}
}
Gibts irgendeinen Trick? So kann ich hier aber offenbar keine Notes-Objekte cachen?
Gruß Axel
Kann es sein, dass es funktionieren könnte, wenn ich im Constructor einfach darauf verzichte
NotesThread.stermThread();
aufzurufen? ??? >:( :(
Es sieht fast so aus, wobei ich noch weitere Probleme im code habe.
Das wäre natürlich gut. ;D
Dann hätte ich mir aber meine MultiThreading Forschung sparen können.
Gruß Axel
Hallo Axel!
Kannst du die ganze Konsolenausgabe mit Stacktrace posten. Ich würde nämlich schon sagen, dass das so funktioniert.
Grüße
Ralf
hier ist alter Stacktrace:
neueste
NotesException: Object has been removed or recycled
at lotus.domino.local.NotesBase.CheckObject(NotesBase.java:1063)
at lotus.domino.local.Document.getItemValueString(Unknown Source)
at de.aja.db.NotesConnection.getMAsData(NotesConnection.java:75)
at de.aja.gui.model.AbwesenheitTableModelApplet.retrieveNotesData(AbwesenheitTableModelApplet.java:88)
at de.aja.gui.TableAbwesenheit.doChangeWeek(TableAbwesenheit.java:328)
at de.aja.gui.TableAbwesenheit.cbWocheActionPerformed(TableAbwesenheit.java:241)
at de.aja.gui.TableAbwesenheit.access$100(TableAbwesenheit.java:27)
at de.aja.gui.TableAbwesenheit$2.actionPerformed(TableAbwesenheit.java:162)
at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1196)
at javax.swing.JComboBox.setSelectedItem(JComboBox.java:561)
at javax.swing.JComboBox.setSelectedIndex(JComboBox.java:597)
at de.aja.gui.TableAbwesenheit.replaceSelectionWeeks(TableAbwesenheit.java:367)
at de.aja.gui.TableAbwesenheit.init(TableAbwesenheit.java:98)
at sun.applet.AppletPanel.run(AppletPanel.java:348)
at java.lang.Thread.run(Thread.java:536)
Die Zeile 75 war das:
System.out.println(testDoc.getItemValueString("userNameAbb"));
Alls ich nun im Konstruktor das NotesStread.stermThread(); auskommentiert habe, treten diese Probleme offenbar nicht mehr auf.