Erhalten Sie häufig Beschwerden von Kunden über die langsame Reaktionsgeschwindigkeit von JSP-Seiten? Haben Sie schon einmal darüber nachgedacht, wie Ihre WEB-Anwendung der steigenden Anzahl von Besuchen standhalten kann, wenn die Anzahl der Kundenbesuche dramatisch ansteigt? In diesem Artikel werden einige sehr praktische Methoden zum Anpassen von JSP und Servlets beschrieben, mit denen Sie Ihre Servlet- und JSP-Seiten reaktionsfähiger und skalierbarer machen können. Darüber hinaus wird die Systemlast mit zunehmender Benutzerzahl einen gleichmäßigen Aufwärtstrend aufweisen. In diesem Artikel werde ich einige praktische Beispiele und Konfigurationsmethoden verwenden, um die Leistung Ihrer Anwendung unerwartet zu verbessern. Einige dieser Optimierungstechniken werden in Ihre Programmierarbeit implementiert. Andere Technologien beziehen sich auf die Konfiguration des Anwendungsservers. In diesem Artikel beschreiben wir ausführlich, wie Sie die Gesamtleistung Ihrer Anwendung durch die Optimierung von Servlets und JSP-Seiten verbessern können. Bevor Sie diesen Artikel lesen, wird davon ausgegangen, dass Sie über Grundkenntnisse in Servlets und JSP verfügen.
Methode 1: Daten in der init()-Methode des Servlets zwischenspeichern.
Nachdem der Anwendungsserver die Servlet-Instanz initialisiert hat und bevor er Clientanforderungen bedient, 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, sodass sie beim nächsten SQL-Aufruf weiterhin verwendet werden kann:
ö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, wenn Sie Servlet- und JSP-Seiten ändern, ohne die Anwendung neu starten zu müssen Server. 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 die HttpSession auf folgende Weise behandeln:
· Falls nicht erforderlich, sollten Sie die Standardeinstellungen für HttpSession auf der JSP-Seite deaktivieren: Wenn Sie sie nicht explizit angeben, wird jede JSP-Seite standardmäßig auf „HttpSession erstellen“ eingestellt . 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 Datenmengen verwenden Wenn ein Objekt in HttpSession gespeichert wird, serialisiert der Anwendungsserver es jedes Mal, wenn es gelesen oder geschrieben wird, 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: Das Komprimieren der Seitenausgabe
ist eine gute Möglichkeit, Datenredundanz zu beheben, 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. Das Folgende ist ein Codeausschnitt für die Implementierung dieser Methode:
public void doGet(HttpServletRequest request, HttpServletResponse Response)
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("compress") != -1)
{
request.setHeader("Content-Encoding" , "compress");
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 Seiteneinschlussmechanismus.
Es gibt zwei Methoden in JSP, die zum Einbinden einer weiteren Seite verwendet werden können: 1. Verwenden Sie den Einschlussindikator (<%@ 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: Den Lebenszyklus von Javabeans richtig bestimmen
Einer der leistungsstarken Aspekte 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. Seine Verwendung ist wie folgt:
<jsp:useBean id="name" Scope="page|request|session|application" class=
„package.className“ type="typeName">
</jsp:useBean>
Das Scope-Attribut weist auf den Lebenszyklus dieser Bean hin. 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.
Einige andere nützliche Methoden
: Versuchen Sie, den „+“-Operator bei String-Verkettungsoperationen nicht zu verwenden: In der Java-Programmierung verwenden wir oft den „+“-Operator, um mehrere Strings zu verbinden, aber Sie haben vielleicht noch nie daran gedacht. Es wird sich tatsächlich auf das System auswirken Leistung, oder? 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, also sollten wir es versuchen Vermeiden Sie es, diesen Anruf zu verwenden. 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 ( http://Jakarta.apache.org ) zu verwenden, das das Debuggen ohne Methoden wie System.out erleichtern kann .println() wird generiert.
· Kompromisse zwischen ServletOutputStream und PrintWriter: Die Verwendung von PrintWriter kann einen kleinen 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.
Zusammenfassung
Der Zweck dieses Artikels besteht darin, die Leistung Ihrer Anwendung durch einige Optimierungstechniken für Servlets und JSP erheblich zu verbessern und somit 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!