Ralf meint mit "über die JVM eingebunden" : Du tust die jars für den Oracle Zugrieff in das Verzeichnis /lib/ext und hängst sie nicht an den Agenten. Ich hab immer 3rd-party jars in dieses Verzeichnis gepackt. Es ist nicht besonders beliebt bei Administratoren, aber es ist notwendig.
Stephan Wissel hat in einer kürzlichen Diskussion in codestore geschrieben:
[...] What I found in agents: if you have external jars and the agent runs multiple times it starts bleeding memory since a new classloader is instantiated every time.
The solution here is to deploy your jar into lib/ext so it isn't part of your agent, but on the general Java classpath (you can use an LS agent to do the deployment - see the patched updatesite.ntf on OpenNTF). That improves the situation quite a bit. You actually could put everything in the jar and use the agent only to hand over the collection for processing.
Du hast einen Memory Leak in dem Agenten. Ein Hochsetzen des Heap-Spaces verlängert nur ein wenig die Zeit, wann dieser auftritt.
In Agenten solltest du recycle() in Schleifen benutzen.
Typische Situation ist das:
while (doc != null) {
....
Document oldDoc = doc;
doc = vw.getNextDocument();
oldDoc.recycle();
oldDoc = null;
}
Ansonsten alle Notes-Objekte recyclen, die Du mit dem Java Schlüsselwort new instantiierst.
Database, View und Doc unten werden NICHT mit new instantiiert, müssen folglich nicht recycled werden:
Database db = agentContext.getCurrentDatabase();
View vw = db.getView("myView");
Document doc = vw.getFirstDocument();
Die Umgebung, in der der Domino Agent kümmert sich darum. Er recycled die Session und den gesammten Objekt-Tree, der mit der Session initiiert wurde.
Session ist Factory für agentContext
agentContext ist Factory für db
db ist Factory für vw
vw ist Factory für doc.
Der ganze Baum wird über session.recycle() rekursiv recycled und Session recycle wird automatisch am Ende des Domino Agenten aufgerufen.
Wenn Du zu viel recyclest findest Du eine Meldung in der log.nsf.
Gruß Axel
Noch was:
Versuch den Oracle Treiber mal so zu instantiieren:
java.sql.Driver d = (java.sql.Driver)
Class.forName (
"oracle.jdbc.driver.OracleDriver").newInstance ();
DriverManager.registerDriver (d)
Mit der reinen Class.forName() hatte Domino mal Probleme. Mir nicht klar, ob heute noch.
Man sieht auch die Alternative:
Class.forName (
"oracle.jdbc.driver.OracleDriver").newInstance ();
Jedenfalls immer mit newInstance().