Singleton für In-Memory-Caching in WebApp

HankScorpio

Mitglied
Hallo,

ich bastele zur Zeit eine kleine Java-Webapplikation. Innerhalb der Applikation habe ich eine relativ große Baum-Datenstruktur. Diese wird recht aufwendig aus den Daten eines RDBMS aufgebaut, wofür viele Querys und auch Dateizugriffe nötig sind. Diese Datenstruktur wird für fast jeden Seitenaufruf der Webapplikation lesend benötigt. Bisher baue ich die Struktur für jeden Request neu auf, was aber ziemlich ineffizient und total überflüssig ist (nur fürs Experimentalstadium akzeptabel). An sich könnte die Struktur aber dauerhaft im Speicher bleiben und müsste nur ab und zu (im Einsatzfall vielleicht alle paar Tage) aktualisiert werden. Hunderte Requests könnten mit den gleichen Daten bedient werden.

Stellt sich die Frage: Wie mache ich das am geschicktesten? Die naheliegenste Lösung war für mich ein Singleton.

Java:
public final class Singleton {

   private static final Singleton INSTANCE = new Singleton();
 
   private Singleton() {
      // Hier der aufwendige Aufbau der Struktur.
   }

   public static Singleton getInstance() {
      return INSTANCE;
   }

   // ...

}

Klar: Es muss verhindert werden, dass gelesen wird, während die Sturktur neu aufgebaut wird (was auch von der WebApp angestoßen werden kann). Da könnte man ja mit einem Lock arbeiten. Aber wie gesagt, der Bearbeiten-Fall ist selten. Die Struktur wird in der Regel nur gelesen.

Meine Frage: Was spricht dagegen, es über ein solches Singleton zu lösen? Welche Probleme habe ich nicht bedacht? Oder kann man das so machen?

Das Singleton müsste ja eigentlich für die gesamte Lebensdauer der "Application" bestehen und auch gleichzeitigen Zugriffen durch mehrere Requests standhalten, wenn sie alle nur lesend darauf arbeiten. Kommt halt auf das Innenleben der Klasse an, das ist klar.

Übrigens: Load-Verteilung auf mehrere Tomcat-Server oder so spielt keine Rolle für das Vorhaben. Das läuft bloß auf einem einzelnen Server, also um die Verteilung der Daten über mehrere Server hinweg etc. müsste man sich hier keine Gedanken machen.

Es geht mir jetzt zentral um die Frage: Normales Singleton + Java WebApp = "Finger weg" (Wieso??) oder "Kann man machen"

Danke schon mal für euren Rat!

Viele Grüße,
Hank Scorpio


---
"But beware of his generous pensions, plus three weeks paid vacation each year. And on Fridays the lunchroom serves hot dogs and burgers and beer! He loves German beer!"
 

freez

Top Contributor
Also mit static würde ich da gar nicht erst anfangen.

Ich würde ein Managed Bean im Application Scope nehmen. Ist quasi Singleton.
 

HankScorpio

Mitglied
Danke euch für den Verweis auf die Managed Bean! :)

Also mit static würde ich da gar nicht erst anfangen.

Singletons sind nicht immer einfach

Aber damit ich das noch etwas besser verstehe: Wo liegt das Problem beim "klassischen" Singleton im Zusammenhang einer Webapplikation, weshalb ihr davon eher abraten würdet? Oder ist das eher eine Frage von Stil und Geschmack? Oder ist es aus vorausschauenden Gründen nicht gut, weil es in einer Cluster-Umgebung vllt. Probleme macht? ...?

Singletons sind nicht immer einfach: Singleton Pattern in Java
Denn der Singleton-Code, den ich ganz oben im Posting habe, ist ja sogar schon der "gute", den der verlinkte "TheServerSide"-Artikel am Ende als Lösung für Performance- und Thread-Sicherheitsprobleme herleitet. :-?
 
S

Sym

Gast
Ja, Dein Code ist genau richtig für nen Singleton.

Ein Problem mit Singletons allgemein, ist die Testbarkeit. Die meisten Frameworks können ein Singleton nicht mocken. Gerade mit den vielen neuen DI-Frameworks gibt es eine Hülle an Möglichkeiten, die auch Tests unterstützen.

Im Grunde würde ich sagen, Singletons sind einfach 1990...

edit: ein Beispiel ist mir noch eingefallen: Bei einem Singleton wird die Instanz (sofern man ein Singleton richtig nutzt) beim Starten der JVM erzeugt. Der von mir verlinkte Beitrag zeigt ja, wann (und warum) man eine Lazy-Instanziierung vermeiden sollte.

Nutzt Du hingegen eine ApplicationScoped-Bean liegt die Instanziierung beim Container. Und der sollte wissen, wann der geeignete Zeitpunkt ist.

Ach Singletons sind einfach nur 1990 :D
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
A JSF Suche Beispiel für Primefaces Tree als Navigation Web Tier 3
S Seite nur aufrufbar machen für eingeloggte User Web Tier 1
R JavaScript für Java Enterprise Entwickler Web Tier 1
G JSF Webanwendung Editor für JSON gesucht Web Tier 1
S JSP Hm... Vorlage für Java Basierende Webseite? Web Tier 0
J Funktion für AJAX - Problem mit Return Web Tier 14
D Servlet 1 Servlet für alles - Wie Cookies per Ajax? Web Tier 1
R JSF Zugriff für Helpdesk-Mitarbeiter Web Tier 15
I Autocomplete Google Maps für JSF Web Tier 0
W Servlet SPEICHERN UNTER-Dialog für mehrere Dateien Web Tier 4
M JSF Framework für User Management etc. Web Tier 0
D Welches Webframework für REST geeignet Web Tier 1
L java.io.NotSerializableException für domain Objekte - Design Problem? Web Tier 12
M Converter für SelectOneMenu Web Tier 3
J eigene taglib für jsf 2.0 schreiben Web Tier 21
S Empfehlung für stateless Webframework Web Tier 2
J mögliche 'eigene' Konfigurationen für die Web.XML auflisten lassen Web Tier 4
F Wo und wie Daten die für alle Benutzer bestimmt sind verwalten Web Tier 4
S beste Preis/Leistung für Server Web Tier 3
H Relativer Pfad für XML-Datei in JSP-Anwendung Web Tier 3
S Welcher ansatz für Web Application + Web Service Web Tier 5
M JSF Converter für String to List<String> Web Tier 2
R Servlet Resource laden für SMTP - Session Web Tier 4
T JSF Eigener Converter wird nur für Eingabekomponenten aufgerufen? Web Tier 3
O Welche JSF Implementation ist am besten für mich geeignet ? Web Tier 3
T Sprachenauswahl für Projekt Web Tier 3
M JSF Komponentenframework für Web/JSF? Web Tier 7
M JSF Simple Testklasse für Button - MethodNotFoundException? Web Tier 6
B JSF JSF1.1 @Tomcat 5.5 für ein neues Projekt Web Tier 18
I Anwendungsfälle für OO Vererbungshierarchien bei Webapps Web Tier 4
D Struts Mehrsprachigkeit in textfield für key ja, aber für label nein? Web Tier 4
M Classpath für JPA in Tomcat Webapp: Wie konfigurieren? Web Tier 4
S ClassPath für Servlet Web Tier 3
J Welches Framework für Webentwicklung? Web Tier 13
T Plugins für Eclipse Web Tier 9
T JSF Zwei Listen/Vectoren für f:selectItems verknüpfen - möglich? Web Tier 2
ruutaiokwu JSF nur für die präsentation verwenden? Web Tier 4
S Ein ControllerServlet für andere Servlets - Sinnvoll oder nicht? Web Tier 34
C Webspace bzw. Server für GWT Web Tier 5
O Testframework für Webanwendung? HTMLUnit? Web Tier 3
C CMS für GWT Anwendung Web Tier 2
T SVG für JSF2 Web Tier 8
Java.getSkill() Lerngruppe für Tapestry 5 Web Tier 21
T Template für die ganze Seite Web Tier 6
Spin JSF oder PHP für Web Web Tier 4
M Java Framework für größere Projekte verwenden Web Tier 5
Z Erlaubte Klassen für h:selectOneListbox Iteration? Web Tier 2
R Exception? Was für ein Fehler? Web Tier 3
J DataScroller: rowCount für Folgeseiten übernehmen Web Tier 2
M Tomcat - Mehrere Verzeichnisse für die jsp Web Tier 12
N JMX MBean für JBoss 4.2.2 Web Tier 4
E Mime-Type für unbekanntes Programm Web Tier 6
M Best Practice für "Teilnahmebediengung akzeptieren" Web Tier 2
M JSP Custom Tag für Bilder Web Tier 14
H Gibt es für das message-bundle eine Standard - Ordnung? Web Tier 2
J Welcher WebServer(-anbieter) für Servlets? Web Tier 5
N Webfrontend für vorhandenes Programm Web Tier 2
A Einfaches Filter-Servlet für Benutzer-Validierung Web Tier 3
R <fmt:formatDate> und 2 Zeichen für den Wochentag? Web Tier 2
T Ajax / Javascript Plugin für Eclipse Web Tier 1
T Was nehmen für eine Datenbankapplikation mit Webinterface Web Tier 5
G wert für hiddenfield per javascript setzten Web Tier 4
K Escape Charakter für EL Web Tier 4
leifg Parameter für Tags aus String lesen (JSP 1.2) Web Tier 2
N JSF: Servlet für Bilder: Verbindung zu Spring Service ? Web Tier 1
S Mehrere Styleklassen für Tabellenreihen Web Tier 4
J Memory Leak in Servlet nach längere Laufzeit Web Tier 6
S Tomcat Heap Memory erhoehen..? Web Tier 4
C Tomcat total memory Web Tier 11

Ähnliche Java Themen

Neue Themen


Oben