Methode 1: Daten in der init()-Methode des Servlets zwischenspeichern
Nachdem der Anwendungsserver die Servlet-Instanz initialisiert hat und bevor er Clientanforderungen bearbeitet, ruft er die init()-Methode des Servlets auf. Im Lebenszyklus eines Servlets wird die Methode init() nur einmal aufgerufen. Durch das Zwischenspeichern einiger statischer Daten in der init()-Methode oder das Ausführen einiger zeitaufwändiger Vorgänge, die nur einmal ausgeführt werden müssen, kann die Systemleistung erheblich verbessert werden.
Das beste Beispiel ist beispielsweise die Einrichtung eines JDBC-Verbindungspools. Angenommen, wir verwenden die DataSource-Schnittstelle von jdbc2.0, um eine Datenbankverbindung zu erhalten. Wir können uns vorstellen, dass in einer bestimmten Anwendung die Systemleistung stark abnimmt, wenn für jede SQL-Anfrage eine JNDI-Abfrage ausgeführt wird. Die Lösung ist der folgende Code, der die DataSource zwischenspeichert, damit sie beim nächsten SQL-Aufruf weiter verwendet werden kann:
Die öffentliche Klasse ControllerServlet erweitert HttpServlet
{
private javax.sql.DataSource testDS = null;
public void init(ServletConfig config) löst eine ServletException aus
{
super.init(config);
Kontext ctx = null;
versuchen
{
ctx = new InitialContext();
testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS";
}
Catch(NamingException ne)
{
ne.printStackTrace();
}
Catch (Ausnahme e)
{
e.printStackTrace();
}
}
public javax.sql.DataSource getTestDS()
{
testDS zurückgeben;
}
...
...
}
Methode 2: Deaktivieren Sie das automatische Neuladen von Servlets und JSP (automatisches Neuladen).
Servlet/JSP bietet eine praktische Technologie, nämlich die automatische Neuladetechnologie, die Entwicklern eine gute Entwicklungsumgebung bietet, ohne dass der Anwendungsserver neu gestartet werden muss, wenn Sie Servlet- und JSP-Seiten ändern. Diese Technologie bedeutet jedoch einen enormen Verlust an Systemressourcen während der Produktlaufzeit, da sie eine enorme Belastung für den Klassenlader der JSP-Engine darstellt. Daher ist das Ausschalten der automatischen Neuladefunktion eine große Hilfe zur Verbesserung der Systemleistung.
Methode 3: Missbrauchen Sie HttpSession nicht
In vielen Anwendungen muss unser Programm den Status des Clients aufrechterhalten, damit Seiten miteinander kommunizieren können. Da HTTP jedoch von Natur aus zustandslos ist, kann es den Status des Clients leider nicht speichern. Daher stellen allgemeine Anwendungsserver Sitzungen bereit, um den Status des Clients zu speichern. Im JSP-Anwendungsserver wird die Sitzungsfunktion über das HttpSession-Objekt implementiert. Dies ist zwar praktisch, belastet das System jedoch auch erheblich. Denn jedes Mal, wenn Sie eine Sitzung abrufen oder aktualisieren, muss der Systembetreiber zeitaufwändige Serialisierungsvorgänge daran durchführen. Sie können die Systemleistung verbessern, indem Sie HttpSession auf folgende Weise behandeln:
Wenn dies nicht erforderlich ist, sollten Sie die Standardeinstellung von HttpSession auf der JSP-Seite deaktivieren: Wenn Sie sie nicht explizit angeben, erstellt jede JSP-Seite standardmäßig eine HttpSession. Wenn Sie die Sitzung in Ihrer JSP nicht benötigen, können Sie sie über den folgenden JSP-Seitenindikator deaktivieren:
<%@ page session="false"%>
Speichern Sie keine großen Datenobjekte in HttpSession: Wenn Sie große Datenobjekte in HttpSession speichern, serialisiert der Anwendungsserver diese jedes Mal, wenn sie gelesen oder geschrieben werden, wodurch das System zusätzlich belastet wird. Je größer das Datenobjekt ist, das Sie in HttpSession speichern, desto schneller nimmt die Systemleistung ab.
Wenn Sie die HttpSession nicht mehr benötigen, geben Sie sie so schnell wie möglich frei: Wenn Sie die Sitzung nicht mehr benötigen, können Sie sie durch Aufrufen der Methode HttpSession.invalidate() freigeben.
Versuchen Sie, das Sitzungszeitlimit so kurz wie möglich festzulegen: Im JSP-Anwendungsserver gibt es ein Standardsitzungszeitlimit. Wenn der Kunde nach dieser Zeit keine Vorgänge ausführt, gibt das System die entsprechende Sitzung automatisch aus dem Speicher frei. Je größer das Timeout eingestellt ist, desto geringer ist die Systemleistung. Versuchen Sie daher am besten, den Wert so niedrig wie möglich zu halten.
Methode 4: Seitenausgabe komprimieren
Komprimierung ist eine gute Möglichkeit, Datenredundanz zu lösen, insbesondere heute, wenn die Netzwerkbandbreite nicht ausreichend entwickelt ist. Einige Browser unterstützen gzip (GNU zip) zum Komprimieren von HTML-Dateien. Diese Methode kann die Downloadzeit von HTML-Dateien erheblich verkürzen. Wenn Sie daher die von einem Servlet oder einer JSP-Seite generierte HTML-Seite komprimieren, wird der Benutzer das Gefühl haben, dass die Geschwindigkeit beim Durchsuchen der Seite sehr hoch ist. Leider unterstützen nicht alle Browser die GZIP-Komprimierung, aber Sie können in Ihrem Programm prüfen, ob der Browser des Clients dies unterstützt. Hier ist ein Codeausschnitt, wie diese Methode implementiert wird:
public void doGet(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
löst IOException, ServletException aus
{
OutputStream out = null
String-Kodierung = request.getHeader("Accept-Encoding";
if (encoding != null && binding.indexOf("gzip" != -1)
{
request.setHeader("Content-Encoding" , "gzip";
out = new GZIPOutputStream(request.getOutputStream());
}
else if (encoding != null && binding.indexOf("comdivss" != -1)
{
request.setHeader("Content-Encoding" , "comdivss";
out = new ZIPOutputStream(request.getOutputStream());
}
anders
{
out = request.getOutputStream();
}
...
...
}
Methode 5: Verwenden Sie den Thread-Pool.
Der Anwendungsserver erstellt standardmäßig einen Thread für die Verarbeitung jeder einzelnen Client-Anfrage und weist ihnen die service()-Methode zu. Wenn der service()-Methodenaufruf abgeschlossen ist, wird auch der entsprechende Thread abgebrochen . Da das Erstellen und Zerstören von Threads bestimmte Systemressourcen verbraucht, verringert dieser Standardmodus die Systemleistung. Aber glücklicherweise können wir diese Situation ändern, indem wir einen Thread-Pool erstellen. Darüber hinaus müssen wir für diesen Thread-Pool eine minimale Anzahl von Threads und eine maximale Anzahl von Threads festlegen. Wenn der Anwendungsserver startet, erstellt er einen Thread-Pool mit einer Anzahl, die der Mindestanzahl von Threads entspricht. Wenn ein Kunde eine Anfrage hat, wird ein Thread zur Verarbeitung aus dem Pool entnommen zurück in die Mitte legen. Wenn nicht genügend Threads im Pool vorhanden sind, erhöht das System automatisch die Anzahl der Threads im Pool, die Gesamtzahl darf jedoch die maximale Anzahl an Threads nicht überschreiten. Durch die Verwendung des Thread-Pools zeigt die Systemlast bei einem starken Anstieg der Clientanforderungen eine sanfte Aufwärtskurve und verbessert so die Skalierbarkeit des Systems.
Methode 6: Wählen Sie den richtigen Seiteneinbindungsmechanismus
Es gibt zwei Möglichkeiten, eine weitere Seite in JSP einzubinden: 1. Verwenden Sie den Include-Indikator (<%@ includee file="test.jsp" %>). 2. Verwenden Sie den JSP-Indikator (<jsp:includee page="test.jsp" flush="true"/>). In der Praxis habe ich festgestellt, dass die Systemleistung höher sein kann, wenn Sie die erste Methode verwenden.
Methode 7: Bestimmen Sie den Lebenszyklus von Javabeans richtig
Eine der leistungsstarken Funktionen von JSP ist die Unterstützung von Javabeans. Durch die Verwendung des <jsp:useBean>-Tags in der JSP-Seite können Javabeans direkt in eine JSP-Seite eingefügt werden. So verwenden Sie es:
<jsp:useBean id="name" Scope="page|request|session|application" class=
"package.className" type="typeName">
</jsp:useBean>
Das Scope-Attribut gibt den Lebenszyklus dieser Bean an. Der Standardlebenszyklus ist Seite. Wenn Sie den Bean-Lebenszyklus nicht richtig auswählen, beeinträchtigt dies die Leistung des Systems.
Wenn Sie beispielsweise nur eine bestimmte Bean in einer Anfrage verwenden möchten, den Lebenszyklus der Bean jedoch auf „Sitzung“ festlegen, bleibt die Bean nach Ende der Anfrage immer noch im Speicher, es sei denn, die Sitzung läuft ab oder der Benutzer schließt den Browser. Dadurch wird eine gewisse Menge an Speicher verbraucht und die Arbeitslast des JVM-Garbage Collectors unnötig erhöht. Daher wird die Systemleistung verbessert, wenn der richtige Lebenszyklus für Beans festgelegt wird und diese so bald wie möglich nach Ende ihrer Mission bereinigt werden.
andere Methoden
Versuchen Sie, den „+“-Operator nicht in Zeichenfolgenverkettungsoperationen zu verwenden: In der Java-Programmierung verwenden wir häufig den „+“-Operator, um mehrere Zeichenfolgen zu verbinden, aber Sie hätten vielleicht nie gedacht, dass dies tatsächlich Auswirkungen auf die Systemleistung haben würde. Da Zeichenfolgen Konstanten sind, generiert die JVM einige temporäre Objekte. Je mehr „+“ Sie verwenden, desto mehr temporäre Objekte werden generiert, was sich auch auf die Systemleistung auswirkt. Die Lösung besteht darin, ein StringBuffer-Objekt anstelle des „+“-Operators zu verwenden.
Vermeiden Sie die Verwendung der System.out.println()-Methode: Da es sich bei System.out.println() um einen synchronen Aufruf handelt, muss der Festplatten-E/A-Vorgang beim Aufruf auf seinen Abschluss warten, daher sollten wir versuchen, dies zu vermeiden es benutzen. Aber es ist ein unverzichtbares und praktisches Werkzeug, wenn wir das Programm debuggen. Um diesen Widerspruch zu lösen, empfehle ich Ihnen, das Log4j-Tool zu verwenden, das das Debuggen erleichtern kann, ohne die Methode System.out.println() zu generieren.
Kompromisse zwischen ServletOutputStream und PrintWriter: Die Verwendung von PrintWriter kann einen geringen Overhead mit sich bringen, da die gesamte Rohausgabe zur Ausgabe in einen Zeichenstrom konvertiert wird. Wenn sie also als Seitenausgabe verwendet wird, muss das System einen Konvertierungsprozess durchführen. Es gibt kein Problem, wenn Sie ServletOutputStream als Seitenausgabe verwenden, die Ausgabe erfolgt jedoch binär. Daher müssen die Vor- und Nachteile beider in der praktischen Anwendung abgewogen werden.
Zusammenfassen
Der Zweck dieses Artikels besteht darin, die Leistung Ihrer Anwendung durch einige Optimierungstechniken für Servlets und JSP erheblich zu verbessern und so die Leistung der gesamten J2EE-Anwendung zu verbessern. Durch diese Optimierungstechniken können Sie feststellen, dass nicht eine bestimmte technische Plattform (wie der Streit zwischen J2EE und .NET) die Leistung Ihrer Anwendung bestimmt. Wichtig ist, dass Sie ein tieferes Verständnis dieser Plattform haben Nur dann können Sie Ihre Anwendung grundlegend optimieren!