Java Web Application: Wie implementiert man Caching-Techniken?
Ich bin die Entwicklung einer Java web-Anwendung, Grundlagen it-Verhalten durch große XML-Konfigurationsdateien, die geladen werden, die von einem web-service. Da diese Dateien sind eigentlich nicht erforderlich, bis zu einem bestimmten Abschnitt der Anwendung zugegriffen wird, belastet Sie träge. Wenn man diese Dateien sind erforderlich, eine Abfrage an den webservice zum abrufen der entsprechenden Datei. Als einige der Konfigurationsdateien verwendet werden könnten viel, viel öfter als andere, würde ich mag, um das setup irgendeine Art von caching (mit vielleicht 1 Stunde Ablauf Zeit) zu vermeiden, erbitten, die gleiche Datei über und über.
Dateien, die vom Webdienst zurückgegeben werden, sind die gleichen für alle Benutzer in allen Sitzungen. Ich nicht mit JSP, JSF oder andere ausgefallene Rahmen, einfach nur servlets.
Meine Frage ist, was als beste Praxis zur Umsetzung eines solchen globalen, statischen cache innerhalb einer java Web-Anwendung? Ist eine singleton-Klasse geeignet, oder gibt es seltsame Verhaltensweisen durch den J2EE Container? Sollte ich aussetzen, irgendwo etwas über JNDI? Was soll ich tun, damit mein cache nicht geschraubt bekommen in Cluster-Umgebungen (es ist OK, aber nicht notwendig, um eine cache-pro-Cluster-server)?
Angesichts der Angaben oben, Wäre es, eine korrekte Umsetzung auf ein Objekt, verantwortlich für das caching als ServletContext Attribut?
Hinweis: ich möchte nicht, laden Sie alle am Start-und mit ihm getan werden, denn das würde
1). überlastung der webservice immer, wenn meine Anwendung gestartet
2). Die Dateien ändern kann, während meine Anwendung läuft, ich hätte also requery Sie trotzdem
3). Ich bräuchte noch einen Global zugänglichen cache, damit ist meine Frage immer noch hält
Update: Mit einem caching-proxy (wie squid), kann eine gute Idee sein, aber jede Anfrage an den webservice senden ziemlich große XML-Abfrage in die post-Daten, die kann jedes mal anders. Nur die web-Anwendung wirklich weiß, dass zwei unterschiedliche Aufrufe an den webservice sind tatsächlich gleichwertig.
Vielen Dank für Ihre Hilfe
InformationsquelleAutor der Frage LordOfThePigs | 2009-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage enthält mehrere getrennte Fragen zusammen. Lassen Sie uns langsam beginnen. ServletContext ist eine gute Stelle, wo Sie speichern können, Griff zu Ihren cache. Sie bezahlen aber durch cache pro server-Instanz. Es sollte kein problem sein. Wenn Sie sich registrieren möchten cache in breiter Palette prüfen, Registrierung in JNDI.
Das problem mit caching. Im Grunde, Sie sind das abrufen von xml via webservice. Wenn Sie accesing dieser webservice via HTTP installieren Sie einfachen HTTP-proxy-server auf Ihrer Seite, die sich mit caching von xml. Der nächste Schritt wird sein, das caching behoben xml in eine Art von lokalen Objekt-cache. Dieser cache besteht pro server ohne Probleme. In diesem zweiten Fall wird der EHCache tun perfekten job. In diesem Fall die Kette der Verarbeitung wird, wie dies
Client - http request -> servlet -> look into local cache - if not cached -> look into http proxy (xml files) -> do proxy job (http to webservice)
.Vorteile:
Nachteile:
Update: vergessen Sie nicht, immer senden von HTTP-HEAD-request in proxy, um sicherzustellen, dass die cache up to date ist.
InformationsquelleAutor der Antwort
Hier ist ein Beispiel für caching mit EhCache. Dieser code wird verwendet in mehreren Projekten zur Umsetzung der ad-hoc-caching.
1) Legen Sie Ihren cache im globalen Kontext. (Vergessen Sie nicht, fügen Sie die Zuhörer in WEB.XML).
2) das Abrufen der cache-Instanz, wenn Sie es brauchen. d.h. von einem servlet:
cache = (Cache) this.getContext().getAttribute("dbCache");
3) Abfrage der cache kurz bevor Sie es tun, eine teure operation.
4) vergessen Sie Auch nicht zu entkräften zwischengespeicherten Objekte bei Bedarf.
Finden Sie weitere Proben hier
InformationsquelleAutor der Antwort javito
Option #1: ein Open-Source-Caching-Bibliothek wie EHCache
Nicht implementieren Ihre eigenen cache, wenn es gibt eine Reihe von guten open-source-alternativen, Sie können die drop-in und starten Sie mit. Umsetzung eigener cache ist viel komplexer als die meisten Leute realisieren, und wenn Sie nicht genau wissen, was Sie tun wrt-threading werden Sie leicht beginnen, das Rad neu erfinden und die Lösung einige sehr schwierige Probleme.
Ich würde empfehlen, EHCache es ist unter einer Apache-Lizenz. Sie wollen einen Blick auf die EHCace code-Beispiele.
Option #2: Tintenfisch
Eine noch einfachere Lösung für dein problem wäre die Verwendung von Squid... Squid in zwischen dem Prozess, der fordert die Daten zwischengespeichert werden und das system die Anforderung: http://www.squid-cache.org/
InformationsquelleAutor der Antwort Tim O'Brien
Nachdem ich einige mehr auf der Suche um mich herum, es scheint, dass der einfachste Weg, das zu erreichen, was ich brauche (innerhalb der Anforderungen und akzeptablen Einschränkungen in der Frage), wäre meine caching-Objekt dem Servlet-Kontext, und man ihn (oder übergabe in der Umgebung), wo nötig.
Ich würde nur zu instanziieren meine Konfiguration loader von einem ServletContextListener und innerhalb der contextInitialized () - Methode, würde ich, verstauen Sie es einfach in den ServletContext mit ServletContext.setAttribute(). Es ist dann leicht zu sehen, der es von den servlets, die sich mit Wunsch.getSession().getServletContext().getAttribute().
Ich nehme an, das ist der richtige Weg, es zu tun, ohne dass Frühling oder jede andere dependency-injection-framework.
InformationsquelleAutor der Antwort LordOfThePigs
Bref , können Sie diese bereit, Frühling ehcache-Konfiguration
1- ehcache.xml : zeigen Sie die Globale Konfiguration von Ehcache.
2- ehcache-spring.xml : erstellen EhCacheManagerFactoryBean und EhCacheFactoryBean.
3 - Inject "myCache" Bohne, die in Ihre business-class finden Sie in der folgenden Beispiele, um loszulegen bekommen und setzen ein Objekt in Ihrem cache.
InformationsquelleAutor der Antwort Monsif EL AISSOUSSI
Habe ich keine Probleme gehabt mit putting-Cache-Objekt-Instanz in ServletContext. Vergessen Sie nicht, die anderen 2 Optionen (request-scope session-scope) mit setAttributes Methoden dieser Objekte. Alles, was nativ unterstützt wird innen webcontainers-und j2ee-serveers ist gut (by gut, ich meine, es ist Hersteller unabhängig und ohne schwere j2ee librarires wie Frühling). Meine wichtigsten Anforderungen ist, dass die Server bekommt und innerhalb von 5-10 Sekunden.
Ich mag wirklich alle caching-Lösung, denn es ist so leicht, es zu bekommen arbeiten auf der lokalen Maschine, und schwer, um es arbeiten auf Maschinen in der Produktion. EHCACHE, Infinispan, etc.. es sei denn, Sie müssen die cluster-wide-Replikation /Verteilung, nahtlos integriert mit Java-ökosystem, die Sie verwenden können, REDIS (NOSQL-datatabase) oder nodejs ... Alles, was mit HTTP-interface zu tun. Vor allem
Caching kann wirklich leicht sein, und hier ist die Reine java-Lösung (ohne Rahmen):
Finden Sie auf dieser link für weitere Verbesserungen.
InformationsquelleAutor der Antwort Mitja Gustin