Frage zu Mehrbenutzerfähigkeit/Timeout

Status
Nicht offen für weitere Antworten.

Ceene

Aktives Mitglied
Hallo alle zusammen

Ich habe da mal eine allgemeine Frage zu Stateful-Session-Beans.
Ich habe in meinem Projekt mehrere SessioBeans mit jeweils einer Connection zu einer Oracle-Datenbank. Mit der Connection sperre ich gelgentlich einen Datensatz in der Datenbank. Das funktioniert auch alles super und genau so wie es soll, leider hat sich nur ein kleines Problem herausgestellt. Ich hoffe ihr könnt mir da helfen.

Wenn ich nun einen Datensatz gesperrt habe und der Session-Timeout einsetzt so möchte ich die Connection gerene noch schließen. Leider weiß ich nicht wo ich das machen kann. Gibt es denn generell die Möglichkeit vor dem Timeout die Connection im Bean direkt zu schließen?

Zur Zeit mache ich das über eine Klasse die dann vor dem Timeout ausgeführt wird, leider musste ich die Connection daraufhin auf static setzen, damit sie ohne Fehler geschlossen wird, was aber nicht korrekt ist. Gibt es bei EJB3 nicht eine Methode oder Funktion oder Annotation mit der ich vor dem Timeout noch die Connection schließen kann?
 

foobar

Top Contributor
Das Handling der Connections ist eigentlich Sache des ConnectionPools. Erstellst du etwa manuell Connections?
 

Ceene

Aktives Mitglied
Ja. Ich weiß das das nicht so toll ist, aber es geht leider nicht anders.
Da ich ab und an mal Datensätze sperren muss und das über die normalen Queries nicht geht mache ich das so.

ConnectionPool? Was ist das? Hab ich noch nichts von gelesen.
 
Zuletzt bearbeitet:

foobar

Top Contributor
Der Applicationserver verwaltet einen Pool von Connections und stellt diese den Anwendungen zur Verfügung. D.h. du mußt nicht manuell Connections aufbauen, schliessen etc. das macht alles der Applicationserver respektive der ConnectionPool für dich.
Du lässt einfach einen JPA EntityManager in deine EJB injizieren. Wo der her kommt spielt für dich als Entwickler dann keine Rolle.

Datensätze sperren kann man über reines JPA im Moment glaube ich nicht. Das kommt erst mit JPA 2.0.
Du kannst das aber mit Hibernate direkt machen: 11.4.Pessimistic Locking
 

Ceene

Aktives Mitglied
Vielen Dank für die schnellen Antworten

Ich habe das Problem nun gelöst. Mit der Annotation @PreDestroy kann ich noch Resourcen freigeben b evor das Bean zerstört wird. Hier kann ich meine Connection pro Bean freigeben.

Für die die auch das Problem haben, die Annotation @PreDestroy kann über jede Methode geschrieben werden, allerdings nur einmal im Bean.
 

FArt

Top Contributor
Vielen Dank für die schnellen Antworten

Ich habe das Problem nun gelöst. Mit der Annotation @PreDestroy kann ich noch Resourcen freigeben b evor das Bean zerstört wird. Hier kann ich meine Connection pro Bean freigeben.

Für die die auch das Problem haben, die Annotation @PreDestroy kann über jede Methode geschrieben werden, allerdings nur einmal im Bean.

Das ist keine Lösung. Ich habe jetzt nur den Lifecycle von EJB2 im Kopf, denke aber nicht, dass sich da was geändert hat.
Wenn das Bean passiviert ist, wird ejbRemove (bzw. der entsprechende Callback über Annotation) nicht aufgerufen, deine Ressource also u.U. nicht freigegeben. Auch der static wäre fatal bei einer Passivierung.

Richtiger Ansatz: mache dir noch mal Gedanken über deinen Anforderungen. Deine Anforderung ist NICHT eine Tabelle zu sperren. Viel eher geht es wohl um einen Synchronisationsmechanismus, den man sauber und konsistent über einen Service oder ein Queuing realisieren könnte.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben