Optimieren Sie die Leistung Ihrer modernisierten AWS Blu Age-Anwendung - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Optimieren Sie die Leistung Ihrer modernisierten AWS Blu Age-Anwendung

Vishal Jaswani, Manish Roy und Himanshu Sah, Amazon Web Services

Übersicht

Mainframe-Anwendungen, die mit AWS Blu Age modernisiert wurden, erfordern Funktions- und Leistungsgleichwertigkeitstests, bevor sie in der Produktion eingesetzt werden. Bei Leistungstests können modernisierte Anwendungen langsamer ausgeführt werden als ältere Systeme, insbesondere bei komplexen Batch-Jobs. Dieser Unterschied besteht darin, dass Mainframe-Anwendungen monolithisch sind, wohingegen moderne Anwendungen mehrstufige Architekturen verwenden. Dieses Muster stellt Optimierungstechniken zur Behebung dieser Leistungslücken für Anwendungen vor, die mithilfe von automatisiertem Refactoring mit Blu Age modernisiert wurden. AWS

Das Muster verwendet das AWS Blu Age-Modernisierungsframework mit systemeigenen Java- und Datenbankoptimierungsfunktionen, um Leistungsengpässe zu identifizieren und zu beheben. Das Muster beschreibt, wie Sie mithilfe von Profilerstellung und Überwachung Leistungsprobleme anhand von Kennzahlen wie SQL-Ausführungszeiten, Speicherauslastung und Mustern identifizieren können. I/O Anschließend wird erklärt, wie Sie gezielte Optimierungen anwenden können, darunter die Umstrukturierung von Datenbankabfragen, das Zwischenspeichern und die Verfeinerung der Geschäftslogik.

Die Verbesserungen der Batch-Verarbeitungszeiten und der Auslastung der Systemressourcen tragen dazu bei, dass Sie das Mainframe-Leistungsniveau Ihrer modernisierten Systeme erreichen. Dieser Ansatz gewährleistet die funktionale Gleichwertigkeit beim Übergang zu modernen Cloud-basierten Architekturen.

Um dieses Muster zu verwenden, richten Sie Ihr System ein und identifizieren Sie Leistungsprobleme, indem Sie den Anweisungen im Abschnitt Epics folgen und die Optimierungstechniken anwenden, die im Abschnitt Architektur ausführlich behandelt werden.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Eine modernisierte AWS Anwendung von Blue Age

  • Eine Lizenz JProfiler

  • Administratorrechte zur Installation des Datenbankclients und der Profilerstellungstools

  • AWS Blu Age Level 3-Zertifizierung

  • Kenntnisse des AWS Blu Age-Frameworks, der generierten Codestruktur und der Java-Programmierung auf mittlerem Niveau

Einschränkungen

Die folgenden Optimierungsmöglichkeiten und Merkmale fallen nicht in den Geltungsbereich dieses Musters:

  • Optimierung der Netzwerklatenz zwischen Anwendungsebenen

  • Optimierungen auf Infrastrukturebene durch Amazon Elastic Compute Cloud (Amazon EC2) Instance-Typen und Speicheroptimierung

  • Gleichzeitige Benutzerlasttests und Stresstests

Produktversionen

  • JProfiler Version 13.0 oder höher (wir empfehlen die neueste Version)

  • pgAdmin Version 8.14 oder höher

Architektur

Dieses Muster richtet mithilfe von Tools wie pgAdmin eine Profilierungsumgebung für eine AWS Blu Age-Anwendung ein. JProfiler Es unterstützt die Optimierung mit dem von AWS Blu SQLExecution Age APIs bereitgestellten DAOManager and Builder.

Der Rest dieses Abschnitts enthält detaillierte Informationen und Beispiele zur Identifizierung von Performance-Hotspots und Optimierungsstrategien für Ihre modernisierten Anwendungen. Die Schritte im Abschnitt Epics beziehen sich auf diese Informationen, um weitere Anleitungen zu erhalten.

Identifizierung von Leistungs-Hotspots in modernisierten Mainframe-Anwendungen

In modernisierten Mainframe-Anwendungen sind Performance-Hotspots bestimmte Bereiche im Code, die zu erheblichen Verlangsamungen oder Ineffizienzen führen. Diese Hotspots werden häufig durch die architektonischen Unterschiede zwischen Mainframe- und modernisierten Anwendungen verursacht. Um diese Leistungsengpässe zu identifizieren und die Leistung Ihrer modernisierten Anwendung zu optimieren, können Sie drei Techniken verwenden: SQL-Protokollierung, Abfrageplan und Analyse. EXPLAIN JProfiler

Technik zur Identifizierung von Hotspots: SQL-Protokollierung

Moderne Java-Anwendungen, einschließlich solcher, die mithilfe von AWS Blu Age modernisiert wurden, verfügen über integrierte Funktionen zum Protokollieren von SQL-Abfragen. Sie können spezielle Logger in AWS Blu Age-Projekten aktivieren, um die von Ihrer Anwendung ausgeführten SQL-Anweisungen zu verfolgen und zu analysieren. Diese Technik ist besonders nützlich, um ineffiziente Datenbankzugriffsmuster zu identifizieren, wie z. B. zu viele einzelne Abfragen oder schlecht strukturierte Datenbankaufrufe, die durch Batching oder Verfeinerung von Abfragen optimiert werden könnten.

Um die SQL-Protokollierung in Ihrer modernisierten AWS Blu Age-Anwendung zu implementieren, setzen Sie die Protokollebene auf DEBUG für SQL-Anweisungen in der application.properties Datei, um Details zur Abfrageausführung zu erfassen:

level.org.springframework.beans.factory.support.DefaultListableBeanFactory : WARN level.com.netfective.bluage.gapwalk.runtime.sort.internal: WARN level.org.springframework.jdbc.core.StatementCreatorUtils: DEBUG level.com.netfective.bluage.gapwalk.rt.blu4iv.dao: DEBUG level.com.fiserv.signature: DEBUG level.com.netfective.bluage.gapwalk.database.support.central: DEBUG level.com.netfective.bluage.gapwalk.rt.db.configuration.DatabaseConfiguration: DEBUG level.com.netfective.bluage.gapwalk.rt.db.DatabaseInteractionLoggerUtils: DEBUG level.com.netfective.bluage.gapwalk.database.support.AbstractDatabaseSupport: DEBUG level.com.netfective.bluage.gapwalk.rt: DEBUG

Überwachen Sie Abfragen mit hoher Frequenz und langsamer Leistung, indem Sie die protokollierten Daten verwenden, um Optimierungsziele zu identifizieren. Konzentrieren Sie sich auf Abfragen innerhalb von Batch-Prozessen, da diese in der Regel die größte Auswirkung auf die Leistung haben.

Technik zur Identifizierung von Hotspots: EXPLAIN-Plan abfragen

Diese Methode nutzt die Funktionen zur Abfrageplanung relationaler Datenbankmanagementsysteme. Sie können Befehle wie EXPLAIN in PostgreSQL oder MySQL oder EXPLAIN PLAN in Oracle verwenden, um zu untersuchen, wie Ihre Datenbank eine bestimmte Abfrage ausführen will. Die Ausgabe dieser Befehle bietet wertvolle Einblicke in die Strategie zur Abfrageausführung, einschließlich der Frage, ob Indizes verwendet oder vollständige Tabellenscans durchgeführt werden. Diese Informationen sind entscheidend für die Optimierung der Abfrageleistung, insbesondere in Fällen, in denen eine ordnungsgemäße Indizierung die Ausführungszeit erheblich reduzieren kann.

Extrahieren Sie die sich am häufigsten wiederholenden SQL-Abfragen aus den Anwendungsprotokollen und analysieren Sie den Ausführungspfad langsamer Abfragen mithilfe des für Ihre Datenbank spezifischen EXPLAIN Befehls. Hier ist ein Beispiel für eine PostgreSQL-Datenbank.

Abfrage:

SELECT * FROM tenk1 WHERE unique1 < 100;

EXPLAINBefehl:

EXPLAIN SELECT * FROM tenk1 where unique1 < 100;

Ausgabe:

Bitmap Heap Scan on tenk1 (cost=5.06..224.98 rows=100 width=244) Recheck Cond: (unique1 < 100) -> Bitmap Index Scan on tenk1_unique1 (cost=0.00..5.04 rows=100 width=0) Index Cond: (unique1 < 100)

Sie können die EXPLAIN Ausgabe wie folgt interpretieren:

  • Lesen Sie den EXPLAIN Plan von den innersten bis zu den äußersten Operationen (von unten nach oben).

  • Suchen Sie nach Schlüsselbegriffen. Seq ScanZeigt beispielsweise einen vollständigen Tabellenscan an und Index Scan zeigt die Indexnutzung an.

  • Überprüfen Sie die Kostenwerte: Die erste Zahl steht für die Startkosten und die zweite Zahl für die Gesamtkosten.

  • Sehen Sie sich den rows Wert für die geschätzte Anzahl von Ausgabezeilen an.

In diesem Beispiel verwendet die Abfrage-Engine einen Indexscan, um die passenden Zeilen zu finden, und ruft dann nur diese Zeilen ab (Bitmap Heap Scan). Dies ist trotz der höheren Kosten für den Zugriff auf einzelne Zeilen effizienter als das Scannen der gesamten Tabelle.

Tabellenscanvorgänge in der Ausgabe eines EXPLAIN Plans weisen auf einen fehlenden Index hin. Die Optimierung erfordert die Erstellung eines geeigneten Indexes.

Technik zur Identifizierung von Hotspots: Analyse JProfiler

JProfiler ist ein umfassendes Java-Profiling-Tool, mit dem Sie Leistungsengpässe beheben können, indem es langsame Datenbankaufrufe und CPU-intensive Aufrufe identifiziert. Dieses Tool ist besonders effektiv bei der Identifizierung langsamer SQL-Abfragen und ineffizienter Speichernutzung.

Beispielanalyse für eine Abfrage:

select evt. com.netfective.bluage.gapwalk.rt.blu4iv.dao.Blu4ivTableManager.queryNonTrasactional

Die JProfiler Hot-Spot-Ansicht enthält die folgenden Informationen:

  • Spalte „Zeit

    • Zeigt die gesamte Ausführungsdauer an (z. B. 329 Sekunden)

    • Zeigt den Prozentsatz der gesamten Anwendungszeit an (z. B. 58,7%)

    • Hilft bei der Identifizierung der zeitaufwändigsten Vorgänge

  • Spalte „Durchschnittliche Zeit

    • Zeigt die Dauer pro Ausführung an (z. B. 2.692 Mikrosekunden)

    • Zeigt die individuelle Betriebsleistung an

    • Hilft dabei, langsame Einzelvorgänge zu erkennen

  • Spalte Ereignisse

    • Zeigt die Anzahl der Ausführungen an (z. B. 122.387 Mal)

    • Zeigt die Betriebsfrequenz an

    • Hilft bei der Identifizierung häufig aufgerufener Methoden

Für die Beispielergebnisse:

  • Hohe Frequenz: 122.387 Ausführungen weisen auf Optimierungspotenzial hin

  • Bedenken hinsichtlich der Leistung: 2.692 Mikrosekunden für die durchschnittliche Zeit deuten auf Ineffizienz hin

  • Kritische Auswirkung: 58,7% der Gesamtzeit deuten auf einen großen Engpass hin

JProfiler kann das Laufzeitverhalten Ihrer Anwendung analysieren, um Hotspots aufzudecken, die durch statische Codeanalyse oder SQL-Protokollierung möglicherweise nicht erkennbar sind. Diese Kennzahlen helfen Ihnen dabei, die Abläufe zu identifizieren, die optimiert werden müssen, und die Optimierungsstrategie zu bestimmen, die am effektivsten wäre. Weitere Informationen zu den JProfiler Funktionen finden Sie in der JProfiler Dokumentation.

Wenn Sie diese drei Techniken (SQL-Protokollierung, EXPLAIN Abfrageplan und JProfiler) zusammen verwenden, können Sie sich einen ganzheitlichen Überblick über die Leistungsmerkmale Ihrer Anwendung verschaffen. Indem Sie die kritischsten Performance-Hotspots identifizieren und beheben, können Sie die Leistungslücke zwischen Ihrer ursprünglichen Mainframe-Anwendung und Ihrem modernisierten cloudbasierten System schließen.

Nachdem Sie die Performance-Hotspots Ihrer Anwendung identifiziert haben, können Sie Optimierungsstrategien anwenden, die im nächsten Abschnitt erläutert werden.

Optimierungsstrategien für die Mainframe-Modernisierung

In diesem Abschnitt werden die wichtigsten Strategien zur Optimierung von Anwendungen beschrieben, die von Mainframe-Systemen aus modernisiert wurden. Es konzentriert sich auf drei Strategien: Nutzung vorhandener Strategien APIs, Implementierung von effektivem Caching und Optimierung der Geschäftslogik.

Optimierungsstrategie: Nutzung vorhandener APIs

AWS Blu Age bietet mehrere leistungsstarke APIs In-DAO-Schnittstellen, mit denen Sie die Leistung optimieren können. Zwei Hauptschnittstellen — DAOManager und SQLExecution Builder — bieten Funktionen zur Verbesserung der Anwendungsleistung.

DAOManager

DAOManager dient als primäre Schnittstelle für Datenbankoperationen in modernisierten Anwendungen. Es bietet mehrere Methoden zur Verbesserung der Datenbankoperationen und zur Verbesserung der Anwendungsleistung, insbesondere für einfache Erstellungs-, Lese-, Aktualisierungs- und Löschvorgänge (CRUD) und die Stapelverarbeitung.

  • Verwenden SetMaxResults. In der DAOManager API können Sie die SetMaxResultsMethode verwenden, um die maximale Anzahl von Datensätzen anzugeben, die in einem einzigen Datenbankvorgang abgerufen werden sollen. DAOManager Ruft standardmäßig nur 10 Datensätze gleichzeitig ab, was bei der Verarbeitung großer Datenmengen zu mehreren Datenbankaufrufen führen kann. Verwenden Sie diese Optimierung, wenn Ihre Anwendung eine große Anzahl von Datensätzen verarbeiten muss und derzeit mehrere Datenbankaufrufe durchführt, um sie abzurufen. Dies ist besonders nützlich in Batchverarbeitungsszenarien, in denen Sie durch einen großen Datensatz iterieren. Im folgenden Beispiel verwendet der Code auf der linken Seite (vor der Optimierung) den Standardwert für den Datenabruf von 10 Datensätzen. Der Code auf der rechten Seite (nach der Optimierung) legt fest setMaxResults, dass 100.000 Datensätze gleichzeitig abgerufen werden.

    Beispiel für die Verwendung SetMaxResults zur Vermeidung mehrerer Datenbankaufrufe.
    Anmerkung

    Wählen Sie größere Batchgrößen sorgfältig aus und überprüfen Sie die Objektgröße, da diese Optimierung den Speicherbedarf erhöht.

  • Ersetze SetOnGreatorOrEqual durch SetOnEqual. Diese Optimierung beinhaltet die Änderung der Methode, mit der Sie die Bedingungen für das Abrufen von Datensätzen festlegen. Die SetOnGreatorOrEqualMethode ruft Datensätze ab, die größer oder gleich einem angegebenen Wert sind, wohingegen nur Datensätze SetOnEqualabgerufen werden, die genau dem angegebenen Wert entsprechen.

    Verwenden Sie, SetOnEqualwie im folgenden Codebeispiel dargestellt, wenn Sie wissen, dass Sie exakte Übereinstimmungen benötigen und Sie derzeit die SetOnGreatorOrEqualMethode verwenden, gefolgt von readNextEqual(). Diese Optimierung reduziert unnötiges Abrufen von Daten.

    Beispiel für die Verwendung SetOnEqual zum Abrufen von Datensätzen, die auf einer exakten Übereinstimmung basieren.
  • Verwenden Sie Batch-Schreib- und Aktualisierungsvorgänge. Sie können Batch-Operationen verwenden, um mehrere Schreib- oder Aktualisierungsvorgänge in einer einzigen Datenbanktransaktion zu gruppieren. Dies reduziert die Anzahl der Datenbankaufrufe und kann die Leistung von Vorgängen, die mehrere Datensätze umfassen, erheblich verbessern.

    Im folgenden Beispiel führt der Code auf der linken Seite Schreiboperationen in einer Schleife aus, was die Leistung der Anwendung verlangsamt. Sie können diesen Code optimieren, indem Sie einen Batch-Schreibvorgang verwenden: Bei jeder Iteration der WHILE Schleife fügen Sie Datensätze zu einem Stapel hinzu, bis die Batchgröße eine vorgegebene Größe von 100 erreicht. Sie können den Stapel dann leeren, wenn er die vorgegebene Batchgröße erreicht hat, und anschließend alle verbleibenden Datensätze in die Datenbank übernehmen. Dies ist besonders nützlich in Szenarien, in denen Sie große Datenmengen verarbeiten, die aktualisiert werden müssen.

    Beispiel für die Gruppierung mehrerer Operationen in einer einzigen Datenbanktransaktion.
  • Indizes hinzufügen. Das Hinzufügen von Indizes ist eine Optimierung auf Datenbankebene, die die Abfrageleistung erheblich verbessern kann. Ein Index ermöglicht es der Datenbank, schnell Zeilen mit einem bestimmten Spaltenwert zu finden, ohne die gesamte Tabelle zu scannen. Verwenden Sie die Indizierung für Spalten, die häufig in WHERE Klauseln, JOIN Bedingungen oder ORDER BY Anweisungen verwendet werden. Dies ist besonders wichtig bei großen Tabellen oder wenn ein schneller Datenabruf entscheidend ist.

SQLExecutionBaumeister

SQLExecutionBuilder ist eine flexible API, mit der Sie die Kontrolle über die auszuführenden SQL-Abfragen übernehmen und nur bestimmte Spalten abrufen können, INSERT indem Sie dynamische Tabellennamen verwenden und verwenden. SELECT Im folgenden Beispiel verwendet SQLExecutor Builder eine benutzerdefinierte Abfrage, die Sie definieren.

Beispiel für die Verwendung von SQLExecutor Builder mit einer benutzerdefinierten Abfrage.

Wählen Sie zwischen DAOManager und SQLExecution Builder

Die Wahl zwischen diesen APIs hängt von Ihrem spezifischen Anwendungsfall ab:

  • Verwenden Sie diese Option DAOManager , wenn Sie möchten, dass AWS Blu Age Runtime die SQL-Abfragen generiert, anstatt sie selbst zu schreiben.

  • Wählen Sie SQLExecution Builder, wenn Sie SQL-Abfragen schreiben müssen, um datenbankspezifische Funktionen zu nutzen oder optimale SQL-Abfragen zu schreiben.

Optimierungsstrategie: Caching

In modernisierten Anwendungen kann die Implementierung effektiver Caching-Strategien die Anzahl der Datenbankaufrufe erheblich reduzieren und die Antwortzeiten verbessern. Dies trägt dazu bei, die Leistungslücke zwischen Mainframe- und Cloud-Umgebungen zu schließen.

In AWS Blu Age-Anwendungen verwenden einfache Caching-Implementierungen interne Datenstrukturen wie Hashmaps oder Array-Listen, sodass Sie keine externe Caching-Lösung einrichten müssen, die eine Kosten- und Code-Restrukturierung erfordert. Dieser Ansatz ist besonders effektiv für Daten, auf die häufig zugegriffen wird, die sich jedoch selten ändern. Wenn Sie das Caching implementieren, sollten Sie Speicherbeschränkungen und Aktualisierungsmuster berücksichtigen, um sicherzustellen, dass die zwischengespeicherten Daten konsistent bleiben und tatsächliche Leistungsvorteile bieten.

Der Schlüssel zu erfolgreichem Caching liegt in der Identifizierung der richtigen Daten für den Cache. Im folgenden Beispiel liest der Code auf der linken Seite immer Daten aus der Tabelle, wohingegen der Code auf der rechten Seite Daten aus der Tabelle liest, wenn die lokale Hashmap keinen Wert für einen bestimmten Schlüssel enthält. cacheMapist ein Hashmap-Objekt, das im Kontext des Programms erstellt und in der Cleanup-Methode des Programmkontextes gelöscht wird.

Zwischenspeichern mit: DAOManager

Beispiel für Caching-Optimierungen mit. DAOManager

Caching mit Builder: SQLExecution

Beispiel für Caching-Optimierungen mit Builder. SQLExecution

Optimierungsstrategie: Optimierung der Geschäftslogik

Die Optimierung der Geschäftslogik konzentriert sich auf die Umstrukturierung von automatisch generiertem Code aus AWS Blu Age, um ihn besser an die Funktionen moderner Architekturen anzupassen. Dies wird notwendig, wenn der generierte Code dieselbe Logikstruktur wie der ältere Mainframe-Code beibehält, was für moderne Systeme möglicherweise nicht optimal ist. Ziel ist es, die Leistung zu verbessern und gleichzeitig die funktionale Äquivalenz mit der ursprünglichen Anwendung aufrechtzuerhalten.

Dieser Optimierungsansatz geht über einfache API-Optimierungen und Caching-Strategien hinaus. Es beinhaltet Änderungen an der Art und Weise, wie die Anwendung Daten verarbeitet und mit der Datenbank interagiert. Zu den gängigen Optimierungen gehören die Vermeidung unnötiger Lesevorgänge für einfache Updates, das Entfernen redundanter Datenbankaufrufe und die Umstrukturierung der Datenzugriffsmuster, um sie besser an die moderne Anwendungsarchitektur anzupassen. Nachfolgend sind einige Beispiele aufgeführt:

  • Aktualisierung von Daten direkt in der Datenbank.Strukturieren Sie Ihre Geschäftslogik neu, indem Sie direkte SQL-Updates anstelle mehrerer DAOManager Operationen mit Schleifen verwenden. Der folgende Code (linke Seite) führt beispielsweise mehrere Datenbankaufrufe durch und belegt übermäßig viel Speicher. Insbesondere werden mehrere Datenbank-Lese- und Schreiboperationen innerhalb von Schleifen, einzelne Aktualisierungen statt Stapelverarbeitung und unnötige Objekterstellung für jede Iteration verwendet.

    Der folgende optimierte Code (rechte Seite) verwendet einen einzigen Direct SQL-Aktualisierungsvorgang. Insbesondere verwendet er einen einzigen Datenbankaufruf anstelle mehrerer Aufrufe und benötigt keine Schleifen, da alle Aktualisierungen in einer einzigen Anweisung verarbeitet werden. Diese Optimierung sorgt für eine bessere Leistung und Ressourcennutzung und reduziert die Komplexität. Sie verhindert die SQL-Injection, ermöglicht eine bessere Zwischenspeicherung von Abfrageplänen und trägt zur Verbesserung der Sicherheit bei.

    Restrukturierung von Code durch direkte SQL-Updates anstelle von DAOManager Operationen mit Schleifen.
    Anmerkung

    Verwenden Sie immer parametrisierte Abfragen, um eine SQL-Injection zu verhindern und ein ordnungsgemäßes Transaktionsmanagement sicherzustellen.

  • Reduzierung redundanter Datenbankaufrufe. Redundante Datenbankaufrufe können die Anwendungsleistung erheblich beeinträchtigen, insbesondere wenn sie innerhalb von Schleifen erfolgen. Eine einfache, aber effektive Optimierungstechnik besteht darin, zu vermeiden, dass dieselbe Datenbankabfrage mehrmals wiederholt wird. Der folgende Codevergleich zeigt, wie durch das Verschieben des retrieve() Datenbankaufrufs außerhalb der Schleife die redundante Ausführung identischer Abfragen verhindert wird, was die Effizienz verbessert.

  • Reduzierung von Datenbankaufrufen mithilfe der JOIN SQL-Klausel. Implementieren Sie SQLExecution Builder, um die Aufrufe der Datenbank zu minimieren. SQLExecutionBuilder bietet mehr Kontrolle über die SQL-Generierung und ist besonders nützlich für komplexe Abfragen, die DAOManager nicht effizient verarbeitet werden können. Der folgende Code verwendet beispielsweise mehrere DAOManager Aufrufe:

    List<Employee> employees = daoManager.readAll(); for(Employee emp : employees) { Department dept = deptManager.readById(emp.getDeptId()); // Additional call for each employee Project proj = projManager.readById(emp.getProjId()); // Another call for each employee processEmployeeData(emp, dept, proj); }

    Der optimierte Code verwendet einen einzigen Datenbankaufruf in SQLExecution Builder:

    SQLExecutionBuilder builder = new SQLExecutionBuilder(); builder.append("SELECT e.*, d.name as dept_name, p.name as proj_name"); builder.append("FROM employee e"); builder.append("JOIN department d ON e.dept_id = d.id"); builder.append("JOIN project p ON e.proj_id = p.id"); builder.append("WHERE e.status = ?", "ACTIVE"); List<Map<String, Object>> results = builder.execute(); // Single database call for(Map<String, Object> result : results) { processComplexData(result); }

Optimierungsstrategien gemeinsam verwenden

Diese drei Strategien wirken synergistisch: APIs Bereitstellung der Tools für einen effizienten Datenzugriff, Caching reduziert die Notwendigkeit wiederholter Datenabrufe, und die Optimierung der Geschäftslogik stellt sicher, dass diese so effektiv wie möglich genutzt APIs werden. Die regelmäßige Überwachung und Anpassung dieser Optimierungen gewährleistet kontinuierliche Leistungsverbesserungen bei gleichzeitiger Wahrung der Zuverlässigkeit und Funktionalität der modernisierten Anwendung. Der Schlüssel zum Erfolg liegt darin, zu verstehen, wann und wie die einzelnen Strategien auf der Grundlage der Merkmale und Leistungsziele Ihrer Anwendung angewendet werden müssen.

Tools

  • JProfilerist ein Java-Profiling-Tool, das für Entwickler und Performance-Ingenieure entwickelt wurde. Es analysiert Java-Anwendungen und hilft bei der Identifizierung von Leistungsengpässen, Speicherlecks und Threading-Problemen. JProfiler bietet CPU-, Speicher- und Thread-Profiling sowie Datenbank- und Java-Virtual-Machine-Überwachung (JVM), um Einblicke in das Anwendungsverhalten zu gewinnen.

    Anmerkung

    Als Alternative dazu JProfiler können Sie Java VisualVM verwenden. Dies ist ein kostenloses Open-Source-Tool zur Erstellung und Überwachung von Leistungsprofilen und zur Überwachung von Java-Anwendungen, das eine Echtzeitüberwachung der CPU-Auslastung, des Speicherverbrauchs, der Threadverwaltung und der Garbage-Collection-Statistiken ermöglicht. Da es sich bei Java VisualVM um ein integriertes JDK-Tool handelt, ist es kostengünstiger als JProfiler für grundlegende Profilerstellungsanforderungen.

  • pgAdmin ist ein Open-Source-Verwaltungs- und Entwicklungstool für PostgreSQL. Es bietet eine grafische Oberfläche, mit der Sie Datenbankobjekte erstellen, verwalten und verwenden können. Mit pgAdmin können Sie eine Vielzahl von Aufgaben ausführen, vom Schreiben einfacher SQL-Abfragen bis hin zur Entwicklung komplexer Datenbanken. Zu seinen Funktionen gehören ein SQL-Editor mit Syntaxhervorhebung, ein serverseitiger Code-Editor, ein Scheduling-Agent für SQL-, Shell- und Batch-Aufgaben sowie Unterstützung für alle PostgreSQL-Funktionen für Anfänger und erfahrene PostgreSQL-Benutzer.

Bewährte Methoden

Identifizierung von Leistungs-Hotspots:

  • Dokumentieren Sie grundlegende Leistungskennzahlen, bevor Sie mit Optimierungen beginnen.

  • Legen Sie klare Ziele zur Leistungsverbesserung fest, die auf den Geschäftsanforderungen basieren.

  • Deaktivieren Sie beim Benchmarking die ausführliche Protokollierung, da dies die Leistung beeinträchtigen kann.

  • Richten Sie eine Suite für Leistungstests ein und führen Sie sie regelmäßig aus.

  • Verwenden Sie die neueste Version von pgAdmin. (Ältere Versionen unterstützen den EXPLAIN Abfrageplan nicht.)

  • Beim Benchmarking sollten Sie die Verbindung trennen, JProfiler nachdem Ihre Optimierungen abgeschlossen sind, da dies die Latenz erhöht.

  • Stellen Sie beim Benchmarking sicher, dass Sie den Server im Startmodus statt im Debug-Modus ausführen, da der Debug-Modus die Latenz erhöht.

Optimierungsstrategien:

  • Konfigurieren Sie SetMaxResultsWerte in der application.yaml Datei, um Chargen mit der richtigen Größe gemäß Ihren Systemspezifikationen zu spezifizieren.

  • Konfigurieren Sie SetMaxResultsWerte auf der Grundlage von Datenvolumen und Speicherbeschränkungen.

  • Wechseln Sie SetOnGreatorOrEqualzu SetOnEqualnur bei nachfolgenden Aufrufen.readNextEqual().

  • Behandeln Sie bei Batch-Schreib- oder Aktualisierungsvorgängen den letzten Batch separat, da er möglicherweise kleiner als die konfigurierte Batchgröße ist und beim Schreib- oder Aktualisierungsvorgang übersehen werden könnte.

Zwischenspeichern:

  • Felder, die für das Caching eingeführt wurden processImpl und die bei jeder Ausführung mutieren, sollten immer im jeweiligen Kontext definiert werden. processImpl Die Felder sollten auch mit der Methode doReset() or cleanUp() gelöscht werden.

  • Wenn Sie In-Memory-Caching implementieren, passen Sie die Größe des Caches an. Sehr große Caches, die im Arbeitsspeicher gespeichert sind, können alle Ressourcen beanspruchen, was sich auf die Gesamtleistung Ihrer Anwendung auswirken kann.

SQLExecutionErsteller:

  • Verwenden Sie für Abfragen, die Sie in SQLExecution Builder verwenden möchten, Schlüsselnamen wiePROGRAMNAME_STATEMENTNUMBER.

  • Wenn Sie SQLExecution Builder verwenden, suchen Sie immer nach dem Sqlcod Feld. Dieses Feld enthält einen Wert, der angibt, ob die Abfrage korrekt ausgeführt wurde oder ob Fehler aufgetreten sind.

  • Verwenden Sie parametrisierte Abfragen, um eine SQL-Injection zu verhindern.

Optimierung der Geschäftslogik:

  • Achten Sie bei der Umstrukturierung von Code auf funktionale Äquivalenz und führen Sie Regressionstests und Datenbankvergleiche für die entsprechende Teilmenge von Programmen durch.

  • Pflegen Sie Schnappschüsse zur Profilerstellung zum Vergleich.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Installieren und konfigurieren JProfiler.

  1. Laden Sie auf der JProfiler Download-Seite das JProfiler für Ihr Betriebssystem (Windows, macOS oder Linux) herunter.

  2. Schließen Sie den Installationsvorgang ab, indem Sie den Anweisungen in der JProfiler Dokumentation folgen.

  3. Führen Sie die Erstkonfiguration durch:

    1. Starten Sie die JProfiler Anwendung.

    2. Aktivieren Sie den Lizenzschlüssel.

    3. Konfigurieren Sie die Standard-JVM-Einstellungen.

  4. Überprüfen Sie die Installation:

    1. Starten JProfiler.

    2. Führen Sie eine Test-Profilerstellungssitzung durch. Anweisungen finden Sie unter An lokale Dienste anhängen im Abschnitt Profiling a JVM der Dokumentation. JProfiler

App-Developer

Installieren und konfigurieren Sie pgAdmin.

In diesem Schritt installieren und konfigurieren Sie einen DB-Client für die Abfrage Ihrer Datenbank. Dieses Muster verwendet eine PostgreSQL-Datenbank und pgAdmin als Datenbankclient. Wenn Sie eine andere Datenbank-Engine verwenden, folgen Sie der Dokumentation für den entsprechenden DB-Client.

  1. Laden Sie pgAdmin für Ihr Betriebssystem von der pgAdmin-Downloadseite herunter und installieren Sie es. Legen Sie das Master-Passwort während der Installation fest.

  2. Connect zum Datenbankserver her. Anweisungen finden Sie in der pgAdmin-Dokumentation.

  3. Überprüfen Sie die Installation, indem Sie das pgAdmin Query Tool verwenden, um grundlegende SQL-Abfragen auszuführen.

App-Developer
AufgabeBeschreibungErforderliche Fähigkeiten

Aktivieren Sie die SQL-Abfrageprotokollierung in Ihrer AWS Blu Age-Anwendung.

Aktivieren Sie die Logger für die Protokollierung von SQL-Abfragen in der application.properties Datei Ihrer AWS Blu Age-Anwendung, wie im Abschnitt Architektur beschrieben.

App-Developer

Generieren und analysieren Sie EXPLAIN Abfragepläne, um Schwachstellen bei der Datenbankleistung zu identifizieren.

Einzelheiten finden Sie im Abschnitt Architektur.

App-Developer

Erstellen Sie einen JProfiler Snapshot, um einen Testfall mit langsamer Leistung zu analysieren.

  1. Starten: JProfiler

    1. Öffnen Sie die JProfiler Anwendung.

    2. Wählen Sie im Start Center die Registerkarte Quick Attach aus.

    3. Wählen Sie den Tomcat-Prozess aus der Liste aus.

    4. Wählen Sie Starten.

  2. Konfigurieren Sie die Einstellungen für die Profilerstellung:

    1. Wählen Sie die empfohlene Probenahmeoption.

    2. Behalten Sie die Standardoptionen auf dem Konfigurationsbildschirm bei und wählen Sie dann OK.

    3. Warten Sie, bis der Status Verbunden in der Statusleiste angezeigt wird.

  3. Leistungsdaten aufzeichnen:

    1. Wählen Sie in der Werkzeugleiste die Option Aufnahme starten aus.

    2. Führen Sie Ihren Testfall aus und warten Sie, bis er abgeschlossen ist.

    3. Wählen Sie Aufnahme beenden.

  4. Speichern Sie den Snapshot und zeigen Sie ihn an:

    1. Wählen Sie Snapshot speichern.

    2. Wählen Sie den Speicherort aus, an dem Sie den Snapshot speichern möchten, und wählen Sie dann Speichern.

App-Developer

Analysieren Sie den JProfiler Snapshot, um Leistungsengpässe zu identifizieren.

Gehen Sie wie folgt vor, um den Snapshot zu analysieren. JProfiler

  1. Öffnen Sie den Snapshot:

    1. Wählen Sie Datei, Snapshot öffnen.

    2. Navigieren Sie zum Speicherort des Snapshots.

    3. Wählen Sie Neues Fenster öffnen, um die Analyse zu starten.

  2. Analysieren Sie Datenbankoperationen:

    1. Navigieren Sie zum Abschnitt JDBC/Database und wählen Sie die Registerkarte JPA/Hibernate.

    2. Überprüfen Sie Abfragen nach Zeit (dies ist die Standardsortieroption).

    3. Wählen Sie die oberste Abfrage zur Optimierung aus.

  3. Überprüfen Sie die CPU-Auslastung:

    1. Wählen Sie im Bereich CPU die Ansicht Hot Spots aus.

    2. Identifizieren Sie den Code, der für die Optimierung in Prozent der Zeit an oberster Stelle steht.

    3. Beachten Sie alle wiederkehrenden Muster.

  4. Nachdem Sie Hotspots identifiziert haben, legen Sie eine Ausgangsbasis fest und implementieren Sie dann die entsprechenden Optimierungsstrategien, wie in den folgenden Epen beschrieben. Konzentrieren Sie sich auf diese Optimierungen:

    • Verwenden Sie für langsame Abfragen SQLExecution Builder oder DAOManager Optimierung.

    • Implementieren Sie für häufigen Datenzugriff Caching-Mechanismen.

    • Vereinfachen Sie bei komplexer Geschäftslogik die Logik, vermeiden Sie zu viele Datenbankaufrufe und ermitteln Sie, ob der Code durch Ausführen einer einfachen Abfrage vereinfacht werden kann. Wenn der Code beispielsweise Daten aus Tabelle A in Tabelle B einfügt, schreiben Sie diesen Code neu, um einen SQL-Befehl auszuführen, der dem folgenden ähnelt:

      INSERT INTO TABLE A SELECT * FROM TABLE B
  5. Analysieren und optimieren Sie den Code weiterhin in der Reihenfolge seiner Auswirkungen (vom höchsten zum niedrigsten Wert), bis die Anwendung Ihre Leistungsanforderungen erfüllt.

Weitere Informationen zur Verwendung JProfiler finden Sie im Abschnitt Architektur und in der JProfiler Dokumentation.

App-Developer
AufgabeBeschreibungErforderliche Fähigkeiten

Legen Sie eine Leistungsbasis fest, bevor Sie Optimierungen implementieren.

  1. Führen Sie als erste Leistungsmessung Ihren Testfall ohne Optimierungen aus. Erstellen Sie eine JProfiler Momentaufnahme des aktuellen Status und dokumentieren Sie die folgenden Kennzahlen:

    • Gesamtdauer der Ausführung

    • Anzahl der Datenbankaufrufe

    • Prozentsatz der CPU-Auslastung

    • Muster der Speichernutzung

  2. Erstellen Sie eine Dokument-Baseline:

    1. Speichern Sie alle Metriken mit einem Zeitstempel und den Testbedingungen.

    2. Notieren Sie sich alle externen Faktoren, die sich auf die Leistung auswirken könnten.

    3. Speichern Sie den JProfiler Snapshot zum Vergleich nach der Optimierung.

  3. Planen Sie die Optimierungsänderungen, die im nächsten Epos beschrieben werden:

    1. Überprüfen Sie die Basiskennzahlen.

    2. Identifizieren Sie den Vorgang, den Sie optimieren möchten.

    3. Erstellen Sie eine Sicherungskopie des aktuellen Codes.

    4. Dokumentieren Sie die erwarteten Verbesserungen.

  4. Messen Sie jede Änderung vor der Implementierung:

    1. Führen Sie einen Testfall unter Verwendung von Basisbedingungen aus.

    2. Ausführungszeit aufzeichnen.

    3. Dokumentieren Sie das aktuelle Verhalten.

App-Developer
AufgabeBeschreibungErforderliche Fähigkeiten

Optimieren Sie Leseanrufe.

Optimieren Sie den Datenabruf mithilfe der DAOManager SetMaxResultsMethode. Weitere Informationen zu diesem Ansatz finden Sie im Abschnitt Architektur.

App-Entwickler, DAOManager

Refaktorieren Sie die Geschäftslogik, um mehrere Aufrufe der Datenbank zu vermeiden.

Reduzieren Sie Datenbankaufrufe mithilfe einer JOIN SQL-Klausel. Einzelheiten und Beispiele finden Sie unter Optimierung der Geschäftslogik im Abschnitt Architektur.

App-Entwickler, SQLExecution Builder

Refaktorieren Sie den Code so, dass er Caching verwendet, um die Latenz von Leseaufrufen zu reduzieren.

Informationen zu dieser Technik finden Sie unter Caching im Abschnitt Architektur.

App-Developer

Schreiben Sie ineffizienten Code neu, der mehrere DAOManager Operationen für einfache Aktualisierungsvorgänge verwendet.

Weitere Informationen zum Aktualisieren von Daten direkt in der Datenbank finden Sie unter Optimierung der Geschäftslogik im Abschnitt Architektur.

App-Developer
AufgabeBeschreibungErforderliche Fähigkeiten

Validieren Sie jede Optimierungsänderung iterativ unter Beibehaltung der funktionalen Äquivalenz.

  1. Nachdem Sie die Optimierungen implementiert haben:

    1. Führen Sie dieselben Testfälle anhand der von Ihnen festgelegten Baseline aus.

    2. Notieren Sie die neue Ausführungszeit.

    3. Stellen Sie sicher, dass die Ergebnisse mit der Ausgangsausgabe übereinstimmen.

  2. Wenn die Optimierung zu einer Verbesserung führt, dokumentieren Sie die tatsächlichen Gewinne und fahren Sie dann mit der nächsten Optimierung fort.

    Wenn Sie Probleme feststellen, machen Sie die Änderungen rückgängig, überprüfen Sie Ihren Ansatz und probieren Sie alternative Lösungen aus.

  3. Verfolgen Sie den Fortschritt jeder Änderung:

    1. Vergleichen Sie neue Kennzahlen mit Basiskennzahlen.

    2. Berechnen Sie den Prozentsatz der Verbesserung.

    3. Behalten Sie eine laufende Summe der Gewinne bei.

Anmerkung

Die Verwendung von Basiskennzahlen als Referenz gewährleistet eine genaue Messung der Auswirkungen jeder Optimierung bei gleichzeitiger Wahrung der Systemzuverlässigkeit.

App-Developer

Fehlerbehebung

ProblemLösung

Wenn Sie die moderne Anwendung ausführen, wird eine Ausnahme mit dem Fehler angezeigtQuery_ID not found.

So beheben Sie dieses Problem

  1. Prüfen Sie, ob eine Datei mit dem Namen in dem sql Ordner im Arbeitsverzeichnis des Anwendungsservers query.sql existiert.

  2. Stellen Sie sicher, dass der Name der .sql Datei mit dem Programmnamen übereinstimmt. Für ein Programm mit dem Namen ABC sollte der Dateiname beispielsweise lautenABC.sql.

Sie haben Indizes hinzugefügt, sehen aber keine Leistungsverbesserungen.

Gehen Sie wie folgt vor, um sicherzustellen, dass die Abfrage-Engine den Index verwendet:

  1. Wenn Sie PostgreSQL verwenden, führen Sie den Befehl aus. EXPLAIN <sql query>

  2. Überprüfen Sie die Ausgabe des Befehls auf oder. Seq Scan Index Scan Seq Scanbedeutet, dass der Indexsatz für die Spalten, die die where Klausel der SQL-Abfrage verwendet, nicht verfügbar ist.

  3. Erstellen Sie einen Index für die richtige Gruppe von Spalten und versuchen Sie, Abfragen zu erstellen, die den erstellten Index verwenden.

Sie stoßen auf eine out-of-memory Ausnahme.

Stellen Sie sicher, dass der Code den in der Datenstruktur enthaltenen Speicher freigibt.

Batch-Schreibvorgänge führen zu fehlenden Datensätzen in der Tabelle

Überprüfen Sie den Code, um sicherzustellen, dass ein zusätzlicher Schreibvorgang ausgeführt wird, wenn die Batchanzahl nicht Null ist.

Die SQL-Protokollierung erscheint nicht in den Anwendungsprotokollen.

  1. Überprüfen Sie den Speicherort und die Syntax der Konfigurationsdatei für die Protokollierung.

  2. Stellen Sie sicher, dass die Protokollebene DEBUG für die angegebenen Pakete auf eingestellt ist. Zum Beispiel:

    level.com.netfective.bluage.gapwalk.rt.blu4iv.dao: DEBUG level.org.springframework.jdbc.core: DEBUG
  3. Überprüfen Sie die Berechtigungen für die Protokolldatei des Anwendungsservers.

  4. Starten Sie den Anwendungsserver nach Konfigurationsänderungen neu.

Zugehörige Ressourcen