Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino

Eigenständiger Java Thread

<< < (2/4) > >>

flaite:
Normalerweise schliesst man eine Connection zu einer Datenbank in der Methode, in der man sie öffnet (oder man ist wirklich ernsthafter Frameworkprogrammierer und kennt sich wirklich mit so Zeugs wie ThreadLocals usw. aus).
Oder man benutzt einen Connection Pool, der diese komplexe Aufgabe für einen regelt und den man nicht selber programmieren muß, weils das schon gibt.
Das Problem ist nur, dass du eine Art globales Singleton haben mußt, das für alle Notes Agenten erreichbar ist und genau das ist schwierig.
Hast du dir mal überlegt, die Connections über RMI zu managen?
D.h. Du lässt eine Connection-Pool Anwendung auf einem RMI-Server laufen und du besorgst dir von dort die Connections von Domino aus?
Oder wie wärs mit Websphere. Die Einstiegsversion ist ja Lizenzmässig für Domino mit bei und da auch ein bereits fertig programmierter Connection Pool Mechanismus, den du über jndi ansprechen kannst und der gut dokumentiert sein sollte?

Die einzige Chance, die ich für selbstgedrehtes Threading sehe, bestehen in Daemon Threads (http://www.dpunkt.de/java/Programmieren_mit_Java/Multithreading/8.html). Ich würd mich nur sehr wundern, wenn Domino das zulassen würde.
Und... wie willst du später eine Referenz darauf bekommen.
Normal würd man ja davon ausgehen, dass man jede DatenbankConnection, die man in einem Notes Agent Call öffnet auch wieder schliesst. (kann man nicht oft genug sagen  ;D )
Natürlich ist das Erstellen der Connection eine kostspielige Operation und deshalb gabs ja in J2EE sehr früh diese Connection Pools.
In Domino ist das nur sehr schwer zu nutzen, da es keine globalen Objekte gibt, deren Lebenszyklus die Laufzeit der Anwendung umfasst wie z.B. ServletContext http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletContext.html .

Ralfs Idee die alte Domino Servlet Engine auszukramen halte ich für auf jeden Fall bedenkenswert. Da hast du einen globalen Objektspace, der während der gesamten Laufzeit der Anwendung im Zugriff ist und lebt.

VORSICHT MIT OFFENEN CONNECTIONS.
V.a. musst du auch checken, dass diese nicht stalled sind usw.
Wie gesagt: Für genau so ein performantes und qualitätssicherndes Zeugs wie das hier gibts eben die ganze J2EE Platform mit ihren Produkten.

Axel

thorsten_w:
Ich gebe dir in allen Punkten (bis auf einen, dazu unten) recht.

Ich habe nur leider den Domino Server 6.5 mit seiner JVM 1.3.
Ein update auf J2 oder gar auf Websphere ist nicht möglich (ist geplant... wird aber bis ende nächstes Jahr ganz sicher nichts).

RMI wäre evtl. eine Möglichkeit ich mach mich da mal etwas schlauer.

Ansonsten werde ich mir Pool Mechanismus selbst bauen müssen, solange ich niemanden finde, der ihn für Java 1.3 schon geschrieben hat.


--- Zitat ---VORSICHT MIT OFFENEN CONNECTIONS.
V.a. musst du auch checken, dass diese nicht stalled sind usw.
Wie gesagt: Für genau so ein performantes und qualitätssicherndes Zeugs wie das hier gibts eben die ganze J2EE Platform mit ihren Produkten.

--- Ende Zitat ---

Damit bin ich voll bei dir. Nur sitzt mir die Performence dick im Nacken.


Globale Singletons, welche von allen Agenten erreicht werden können, existieren schon.
Diese werden beim ersten Aufruf initialisiert und existieren solange der HTTP Task läuft.

Ich habe inzwischen auch die Idee von Ralf ausprobiert und sie funktioniert gut.

Ein Problem hab ich allerdings noch :)
Wie rufe ich dieses Servlet zum start des Http tasks auf?

Beziehungsweise, wann das Init am Servlet aufgerufen?
Erst, wenn es im Browser aufgerufen wird? Oder schon, wenn es vom HTTP initialisiert wird?

Ralf_M_Petter:
Ich denke, dass Servlet wird erst beim ersten Zugriff geladen und initialisiert.

Eine Möglichkeit wäre es, von deinen Java Initialisierungsroutingen beim Start de HTTP Servers einfach das Servlet über eine HTTP Verbindung aufzurufen. Ich muß aber Axel rechtgeben, dass ist schon alles ein ziemlicher Hack.

Grüße

Ralf

flaite:

--- Zitat von: thorsten_w am 13.12.05 - 15:00:19 ---Ich habe nur leider den Domino Server 6.5 mit seiner JVM 1.3.

--- Ende Zitat ---
Java1.3 ist Java2. Java2 fing mit Java1.2 an.

Es gibt verschiedene vorhandene Pool-Lösungen. Such mal unter Connection Pooling Java1.3 in Google. Müssen aber etwas ältere Dokumente sein. Modernes beruht auf Java1.4 oder 5.   


--- Zitat ---Wie rufe ich dieses Servlet zum start des Http tasks auf?

--- Ende Zitat ---
Mit Servlets benutzt du besser das Objekt ServletContext. Das sollte schon in der Domino ServletImplementierung dabei sein. Das ist ein globaler Objektraum für alle Servlets deiner Anwendung & Singleton.

init() wird beim ersten Aufruf des Servlets aufgerufen und nur genau einmal. Egal wie oft in diesem Servlet doGet() oder doPost aufgerufen wird. init() wird garantiert vor der ersten service Methode (doGet, doPost) aufgerufen. Du kannst dir aber nicht ganz sicher sein, wie viele Servlet-Instanzen gebildet werden. Normalerweise sollte 1 Objekt pro Servlet Klasse geben. Das lebt dann, solange die ServletEngine läuft. Wie gesagt ist es aber besser, ServletContext als gemeinsamen Objektspace zu nutzen.
Eventuell gibt es auch ini-Parameter, die bewirken, dass init() beim Hochfahren der Servletengine aufgerufen wird. Zumindest gibts sowas in modernen ServletContainern.

Dann dürfte auch die http-Task Lösung nicht notwendig sein. Wie hast du das gemacht?  ??? Respekt.


thorsten_w:
oh .. kleiner fehler... j1.3 ist j2. sry,

Vielleicht sollte ich mal kurz das Umfeld erklären, vielleicht wird damit mein Problem klarer und vielleicht habt ihr eine Idee für eine andere Lösung.

Es gibt einem Fragenpool in einer Mysql-Datenbank.
Dieser Fragenpool hat eine n tiefe der Kategoriesierung hier mal als Beispiel 3 Ebenen mit 3 Fragen und je 2 Antworten.

1. Kategorie
   2. Kategorie
      3a. Kategorie
         1. Frage
            1. Antwort
            2. Antwort
         2. Frage
            1. Antwort
            2. Antwort         
         3. Frage
            1. Antwort
            2. Antwort
      3.b Kategorie
         1. Frage
            1. Antwort
            2. Antwort
         2. Frage
            1. Antwort
            2. Antwort         
         3. Frage
            1. Antwort
            2. Antwort

Jedes Objekt ist natürlich in sich gekapselt.
Zugriffe innerhalb des API werden über eine Factory geregelt und die Kommunikation erfolgt ausschließlich über Interfaces.
Der Grund dafür: Es soll die Mysql-Datenbank wahlweise gegen jede beliebige relationale Datenbank ausgetauscht werden können
beziehungsweise eine Notes-Datenbank gegen Mysql.

Um nicht für jedes Objekt eine Connection zu öffnen (allein in dem oberen Beispiel wären das 22 Verbindungen) muss es ein globales Objekt geben, von dem bei Bedarf eine Verbindung abgeholt werden kann ohne, das sie erst geöffnet werden muss.

Das wird derzeit über einen Singleton realisiert, der aber (wie ich im Anfangsproblem beschrieb) offene Connections zurück läßt.

Wie Axel schon sagte, offene Verbindungen sind gefährlich (kann man nicht oft genug betonen :D).
Mein Problem ist es jetzt eine gute Lösung zu finden ohne das gesamte API um zu schreiben.

Ich habe auch schon darüber nachgedacht, mit dem Start einer AgentBase eine entsprechende Verbindung zu initialisieren aber da ist mir noch keine vernünftige Realisierung eingefallen.

Gruss Thorsten

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln