2016-07-22 4 views
1

Ich entwickle eine Anwendung in Java EE, ich möchte einen Cache mit einem @Singleton EJB implementieren. Dadurch werden Referenzdaten zwischengespeichert, so dass ich nur einmal aus der Datenbank abgerufen und dann im Speicher gespeichert werden muss.Java EE @ Singleton EJB für Cache

Ich möchte aus einer Sicht der Implementierung wissen, ob dies korrekt ist, mit einem @Singleton EJB? oder könntest du mir einen anderen Ansatz empfehlen? und auch wenn das aus einer OOP-Perspektive richtig ist?

Und die @Singleton EJB ist für schreibgeschützt, gibt es irgendwelche Nebenläufigkeit Probleme, die ich begegnen könnte?

Grüße,

+1

Fertig in J2EE-Anwendungen und wird für schreibgeschützte Daten empfohlen. Nur fangen ist, wenn Db ändert, dann müssen Sie entweder neu laden oder es wird widerspiegeln, wenn Sie App neu starten. –

+0

Da Sie neu laden, aktualisieren, mit einem Beobachter aktualisieren können, ist es nicht wirklich ein Haken. http://docs.oracle.com/javaee/6/tutorial/doc/gkhic.html – keni

Antwort

0

Der Ansatz ist in Ordnung, aber der Nachteil ist, dass es nicht einfach ist, später die Lösung zu verbessern - keine schöne Oberfläche. Aber möglich mit jedem JavaEE-Server ohne Migrationsaufwand, wie es Standard-JavaEE ist.

Eine andere Lösung hängt ein wenig von dem Server ab, den Sie verwenden.

WildFly (Gemeinschaft): Sie könnten das interne Infinispan-Subsystem verwenden und es ist in einer HashMap-Weise. Sie können es einfach lokal verwenden, um mit zu beginnen und die Konfiguration in Cluster zu ändern (repliziert oder verteilt), wenn der Cache wächst und Sie mehr Arbeitsspeicher benötigen, um ihn zwischenzuspeichern.

JBoss EAP (Enterprise-Produkt): Hier können Sie das Infinispan-Subsystem nicht verwenden, technisch ist es möglich, aber es wird nicht unterstützt. Sie müssen das zusätzliche JBossDataGrid (JDG) verwenden, das auf Infinispan basiert. Hier haben Sie mehr Optionen, wie oben beschrieben, verwenden Sie den Cache im selben JVM lokal oder dist/repl. Oder auf einer anderen Instanz mit Remote-Zugriff auf den Cache - oft schnell genug, aber Sie haben einen Remote-Zugriff - aber die JVM ist komplett vom Server getrennt und kann anders gepflegt gestartet werden. Auch der Server und der Cache hatten keinen Einfluss auf den Speicher des jeweils anderen.

Für andere Anbieter können Sie auch den JDG-Ansatz (oder Infinispan als OpenSource) verwenden.

0

Als schnelle und einfache Lösung kann Singleton EJB helfen, besonders wenn Kataloge, deren Werte sich nicht ändern.
Man denke nur an Ihrer EJB Singleton Folgendes festgestellt:

  • Concurrency-Management von Containern
  • Alle Methoden für LockType.READ Festlegung gleichzeitig durch eine beliebige Anzahl von Clients zugegriffen

Zum Beispiel:

import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.ejb.ConcurrencyManagement; 
import javax.ejb.ConcurrencyManagementType; 
import javax.ejb.Lock; 
import javax.ejb.LockType; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 

@Singleton 
@Startup 
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) 
public class InitializationBean { 

    @PostConstruct 
    public void initialize() { 
     // load data 
    } 

    @Lock(LockType.READ) 
    public List<String> getCatalog01() { 
     return null; 

    } 

    @Lock(LockType.READ) 
    public List<String> getCatalog02() { 
     return null; 

    } 
}