Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino
Ralf, jemals versucht (Notes-)Database Obj in eigenen Thread zu cachen?
Axel_Janssen:
, oder klammerst du LoNo-Zugriffe aus Applets/Swing grundsätzlich mit stermThread(), sinitThread()?
Ich habs versucht und behaupte nicht der Bär in Thread-Programmierung zu sein.
Unter Standalone Swing funktionierte es ziemlich gut. Unter Applet so gar nicht. Ich vermute es hängt damit zusammen, dass die JVM eine bestimmte Masse an Arbeitsspeicher benötigt, die sie im Browser einfach nicht hat.
- Swing-Objekte sind so nicht Thread-Safe, arbeite mit den Spezialmethoden aus SwingUtilities: invokeAndWait(), invokeLater().
- Applet-Sandbox Sicherheit ist es auch nicht.
Bin gestern leicht wahnsinnig geworden.
Gruß Axel
Ralf_M_Petter:
Ich habe bis jetzt die Zugriffe mit init und Term geklammert, habe aber die Objekte wie Session und Database trotzdem wieder verwendet. Funktioniert einwandfrei. Mich würde aber deine Lösung mit einem eigenen Thread für die Zugriffe interessieren. kannst du den Code in der einfachsten Variante posten?
Hier ein Beispiel die überschriebene Methode getValueAt eines JTable Tablemodells
Zur Erklärung docint ist eine Referenz auf das Notesdokument und it ist eine Referenzvariable für ein NotesItem
BTW Das ist Java Code aus meinen ersten Versuchen und zusätzlich gemacht für JDK 1.1. Deshalb teilweise komische Verwendung von Vector.
public Object getValueAt(int param, int param1) {
Object temp;
try {
NotesThread.sinitThread();
it=docint.getFirstItem((String)NotesFelder.elementAt(param1));
try{
temp= it.getValues().elementAt(param);
}
catch(Exception y){
if (it!=null){
it.recycle();
it=null;
}
NotesThread.stermThread();
return "";
}
it.recycle();
it=null;
NotesThread.stermThread();
if (((String)temp).equals("_")){
return "";
}
return temp;
}
catch (NotesException e){}
try {
it.recycle();
NotesThread.stermThread();
}
catch(Exception x){}
return "";
}
Grüße
Ralf
Axel_Janssen:
8) hoffentlich klappt das hier auch. ::)
(Notes)-Session, (Notes)Database sowie docint erzeugst du im Constructor des JTableModels ?
Und recycle() für diese Instanzvariablen wird dann von irgendeiner gui-Exit Call-Back Methode aufgerufen (sowas wie applet.stop() ?
Ich poste den code später. Bin jetzt ziemlich unter Zeitdruck und werd das dann irgendwie vereinfachen.
Gruß Axel
Ralf_M_Petter:
Das Dok wird als Parameter an den Konstruktor des Tablemodels übergeben. In Applet.stop müsste es reichen, wenn du die Session recycelst, da das alle abhängigen Objekte mit recycelt.. Konnte selber kau mglauben, dass es funktioniert, aber in der Firma in der ich arbeite ist das jetzt seit ca. einem halben Jahr im Echt Einsatz. Ist Teil eines Content Management System.
Kannst du deinen Code posten?
Grüße
Ralf
Axel_Janssen:
--- Zitat von: Ralf_M_Petter am 29.07.03 - 12:04:09 ---Ich habe bis jetzt die Zugriffe mit init und Term geklammert, habe aber die Objekte wie Session und Database trotzdem wieder verwendet.
--- Ende Zitat ---
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).
--- Code: --- 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();
}
--- Ende Code ---
Methode, die immer wieder aufgerufen wird:
--- Code: --- 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;
}
}
--- Ende Code ---
Gibts irgendeinen Trick? So kann ich hier aber offenbar keine Notes-Objekte cachen?
Gruß Axel
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln