Domino 9 und frühere Versionen > ND6: Entwicklung
Wie "eo12345678tm"-Dateien vermeiden ?
(1/1)
datenbanken24:
Wir setzen Java-Agenten in Notes-Datenbanken ein, um z.B. Attachments aus Dokumenten zu bekommen.
Klappt alles einwandfrei, ABER...
der Befehl:
Embedded Object eo = doc.getAttachment(filename)
hinterlässt unabhängig vom Betriebssystem und unabhängig ob Client oder Server
im Notes-Programmverzeichnis
für jeden Aufruf diese
eoXXXXXXXXtm - Dateien,
mit xxxxxxxx als fortlaufende achtstellige Nummer.
db.recycle und session reycling helfen hier nix.
Wie bekommt man diese Dateien wieder weg
bzw. Notes dazu, die von selbst wieder zu löschen ?
Gruß,
Uwe
datenbanken24:
Problem gelöst:
Man muss explizit den
FileInputStream "closen"
fis.close();
UND
das Embededobject recyclen
eo.recycle();
Dann werden die eoXXXXXXXXtm Dateien von Notes wieder automatisch entfernt.
Da man das doc im Web aus dem agentcontext ableitet und nicht aus dem db-Objekt recycelt man beim recyclen des db-Objectes NICHT automatisch das eo-Object mit. Auch das Recyclen der Session reicht hier NICHT aus.
In der Designer-Help gibt es keine Hinweise darauf, dass man das eo-Object (zumindest im Web) explizit recyclen muss.
Marinero Atlántico:
danke für den Hinweis.
Es folgen ein paar altkluge Bemerkungen.
.close() ist definitiv kein Spass-Thema für alle Sorten von Streams und Connections (RDBMS, JMS, files, was auch immer).
Ausserdem hat das ein paar Haken.
--- Code: ---
try {
// fis öffnen
// do stuff
// wird fis geschlossen, wenn hier eine exception geworfen wird? NEIN! fis.close wird dann nicht erreicht.
fis.close();
fis = null;
} catch (ANeededException) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch {}
}
}
--- Ende Code ---
Die Verbindung von Exception-Catching und closen von Streams/Connections kann zu wirklich stark verschachtelten code führen, wenn man robusten code schreiben will (was Sinn macht).
Moderne Frameworks kümmern sich oft darum, was sehr gut ist.
Noch was:
Solltest du FileInputStream direkt verwenden, wrap das in einen BufferedInputStream, so nach der Art:
--- Code: ---BufferedInputStream buf = new BufferedInputStream(new FileInputStream(stuff));
--- Ende Code ---
Das bringt oft sehr merkbare Performancesteigerungen.
Gruß Axel
Navigation
[0] Themen-Index
Zur normalen Ansicht wechseln