Announcement

Collapse
No announcement yet.

Locking von Entity-Beans in JBoss

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Locking von Entity-Beans in JBoss

    Hallo!

    Ich bin gerade in ein offenes Messer gelaufen:
    Laut meinen Recherchen cached JBoss bei der Verwendung von CMP 2.x Datensätze in einem Cache. Deswegen kommt für diesen Cache eine Locking-Strategie zum Einsatz, die in meinem Fall zu Dead-Locks führt, obwohl das gar nicht nötig wäre.

    Kann man diesen Cache irgendwie ausschalten und sich auf das Locking der DB verlassen, welche in einer bestimmten Isolations Stufe läuft (in meinem Fall READ COMMITED) ?

    In der Doku hab ich was von
    org.jboss.ejb.plugins.lock.NoLock
    gelesen, aber das allein wird nicht helfen, weil man ja auch zusätzlich den Cache irgendwie deaktivieren muss ...

    Aber was, wenn ich die Cache-Strategie "C" und dieses NoLock verwenden würde?

    lG Manfred

  • #2
    Hallo Manfed,

    Mit dem Cache hat das weniger zu tun. Entity Beans müssen ja auf irgendeine Weise gelockt werden. Defaultmäßig hält JBoss nur eine einzige Instanz jeder Bean und sperrt diese mit einem QueuedPessimisticEJBLock komplett für andere Transaktionen (unabhängig von den Cache Einstellungen). Das ist natürlich deadlockgefährlich und ev. nicht performant. Man kann z.b. auf optimistic locking zurückgreifen, das ist aber etwas aufwendiger zu konfigurieren und liefert auch nicht immer das erwünschte Verhalten.

    Es gibt eine vorkonfigurierte Einstellung die genau das tut was Du willst. Sie erzeugt pro Transaktion eine Instanz der Bean und überläßt das Sperren der Datenbank. Und natürlich hast Du recht, in diesem Fall muß nach beenden der Transaktion in die Datenbank geschrieben werden, daher ist commit-option C eingestellt (und sollte auch so bleiben :-) Natürlich hat commit-option C auch wieder einen Performance-Nachteil, weil nicht gecacht wird. Um das zu nutzen muß man in der jboss.xml die Konfiguration einstellen:

    <PRE>
    &lt;entity&gt;
    &lt;ejb-name>MyBean&lt;/ejb-name&gt;
    &lt;jndi-name>MyBean&lt;/jndi-name&gt;
    &lt;configuration-name&gt;
    Instance Per Transaction CMP 2.x EntityBean
    &lt;/configuration-name&gt;
    &lt;/entity&gt;

    </PRE>

    In der jbosscmp-jdbc.xml kann man noch row-locking auf true setzen, damit am Beginn der Transaktion die Zeile in der betreffenden Tabelle gesperrt wird. Wenn man das nicht macht, kann es zu einem Deadlock auf der Datenbank kommen, wenn zwei Beans gelesen haben und beide nun schreiben möchten (also beide ein Write-Lock anfordern, was aber keine bekommt)

    Gruß,

    Alwi

    Comment

    Working...
    X