In diesem Artikel wird die effizienteste Methode zum Entfernen einer CMP-Instanz aus einem
Pool der Option A beschrieben. Zuerst fügen Sie Ihrer CMP-Bean eine Methode hinzu.
public void invalidateFromCache()
{
}
Fügen Sie diese Methode dem lokalen CMP-Interface hinzu. Ändern Sie den Deskriptor für die Methode so, dass
er TX_REQUIRED verwendet.
Sie können hierfür den Editor für EJB-Deskriptoren verwenden. Klicken Sie auf das Register "Assemblierung" und
anschließend in der Anzeige "Containertransaktionen" auf
Hinzufügen....
Wählen Sie die CMP aus und klicken Sie anschließend auf die Methode invalidateFromCache.
Wählen Sie im Kombinationsfeld die Option "Erforderlich" aus und klicken Sie anschließend auf
OK. Daraufhin sollte eine Nachricht wie "Fehler: Referenzquelle nicht gefunden" angezeigt werden.
Fügen Sie anschließend eine Home-Methode wie die folgende hinzu:
public void ejbHomeInvalidateCompleteOrders(Collection/*<orderlocal>*/ orders)
{
Iterator iter = orders.iterator();
while(iter.hasNext())
{
OrderLocal order = (OrderLocal)iter.next();
// Damit wird die Bean der Option A der Transaktion hinzugefügt, damit
// sie beim Rollback verworfen, d. h. aus dem Cache entfernt wird.
order.invalidateFromCache();
}
myEntityCtx.setRollbackOnly();
}
Fügen Sie diese Methode dem lokalen Bean-Interface hinzu. Klicken Sie mit der rechten
Maustaste auf die Methode, wählen Sie "Enterprise-Beans" aus und stufen Sie sie auf das lokale Interface hoch.
Setzen Sie dieses Transaktionsattribut für die Methode auf dieselbe Weise wie zuvor beschrieben auf
"RequiresNew".
Diese Methode akzeptiert eine Liste mit OrderLocals (die CMP hat den Namen Order) und entfernt Sie aus dem Cache der
Option A.
Sie könnten auch eine Liste von Schlüsseln verwenden, aber in diesem Fall müssten Sie eine
Methode findByPrimaryKey ausführen und anschließend die Methode aufrufen.
Dieses Verfahren ist aufwändiger als das hier beschriebene. Die Methode iteriert durch die Liste
und ruft für jede Order in der Liste die Invalidierungsmethode (invalidate) auf.
Die Invalidierungsmethode ordnet die Bean der Option A der aktuellen Transaktion zu.
Nachdem der Transaktion alle Beans zugeordnet wurden, wird sie mit "Nur Rollback" markiert.
Wenn die Methode zurückkehrt, wird die Transaktion rückgängig gemacht und alle zugeordneten Beans der Option A werden aus dem
Cache verworfen.
Die Business-Logik akzeptiert einen neuen Auftrag (Order).
Beim Akzeptieren eines neuen
Auftrags können verschiedene andere Aufträge fertig gestellt werden.
Die Methode acceptOrder gibt eine List<
OrderLocal> an den Aufrufenden zurück.
Der Aufrufende muss diese Liste an die Home-Methode übergeben, damit die Einträge aus dem Cache entfernt werden.
Die Einträge werden nicht aus der Datenbank, sondern nur aus dem Cache gelöscht. Beispiel:
BookLocal book = ivBookHome.findByPrimaryKey(ivOrder.getSymbol());
Collection/*<OrderKey>*/ completedOrders =
book.acceptOrder(session, pub, ivOrder, cache);
// Alle abgeschlossen Aufträge aus dem CMP-Cache der Option A invalidieren.
try {
if(!completedOrders.isEmpty())
ivOrderHome.invalidateCompleteOrders(completedOrders);
}
catch (Exception e)
{
// Erwartete Ausnahme ignorieren
}
Das Beispiel zeigt eine CMP mit dem Namen Book, die die Methode zum Akzeptieren des Auftrags (acceptOrder)
aufruft.
Diese Methode gibt die Aufträge zurück, die aus dem Cache entfernt werden sollen.
Die Methode acceptOrder verwendet eine Transaktion des Typs RequiresNew, damit die Transaktion automatisch
bei der Rückkehr der Methode festgeschrieben wird.
Anschließend wird die Home-Methode für Order verwendet, um die zurückgegebenen CMPs aus dem Cache zu entfernen.
Die Methode
acceptOrder erfasst lediglich die Order-Instanzen, die entfernt werden müssen. Beispiel:
public Collection/*<OrderLocal>*/ acceptOrder(…)
Collection completeOrders = new LinkedList();
OrderLocal buyer = ...;
OrderLocal seller = ...;
... some business logic....
if(buyer.getIsComplete())
completeOrders.add(buyer);
if(seller.getIsComplete())
completeOrders.add(seller);
…
return completedOrders;
}
Dieser Code veranschaulicht, wie die Anwendung ein zwischengespeichertes Objekt entfernt, dessen Bearbeitung abgeschlossen ist.
Wenn die Anwendung nicht so vorgeht, enthält der Cache nützliche und nutzlose Instanzen.
Die nützlichen Instanzen sind Datensätze, die weiterhin benötigt werden, deren Bearbeitung noch ansteht oder noch nicht abgeschlossen ist.
Es gibt keinen Grund, abgeschlossene Datensätze zwischenzuspeichern.
Eine Anwendung kann diese Methode einsetzen, um abgeschlossene Objekte zu entfernen.