ASH Viewer: Neustart

Was tun, wenn Sie mit Daten arbeiten müssen, die noch keine großen Datenmengen sind, aber bereits mehr als das, was in den Arbeitsspeicher des Computers passt und für die Excel-Funktionen ausreichen? Für Fahrradliebhaber liegt die Antwort auf der Hand: Sie müssen etwas Eigenes schreiben (ja, wir suchen nicht nach einfachen Wegen).

Aber was ist, wenn der Code, den Sie in der Vergangenheit geschrieben haben, schrecklich ist und Ihnen nicht die Möglichkeit gibt, das Projekt zu entwickeln? Legen Sie die alten Entwicklungen beiseite, weichen Sie einem neuen, ewigen und hellen (ja, ja, und auch hier ohne Optionen).



Zitat aus CF Matrix: "Eine Tablette ist genug, Neo." Regie: Wachowski Brüder und Schwestern. 1999. USA

Vor mehr als 10 Jahren habe ich Code für ASH Viewer geschrieben (mehr über meinen Pfad hier ), ihn zuerst auf sourceforge.net und dann auf github veröffentlicht, damit die Benutzer eine Verbindung herstellen und Funktionen hinzufügen und Fehler korrigieren können. Das Projekt wurde mit Gradle erstellt und hat Probleme mit der Anzeige von Diagrammen behoben: eine fast vollständige Liste der Verbesserungen anhand der Referenz .

Ich erkannte jedoch, dass der vor zehn Jahren geschriebene Code, gelinde gesagt, unvollkommen ist. Äußerlich sah alles gut aus, die Funktionalität wurde entwickelt, die Leute aktiv genutzt und bedankt. Das Programm enthielt jedoch alle Fehler der ersten Codierungserfahrung, was natürlich die Entwicklung des Projekts stark behinderte.

Allen, die bereit waren, ernsthaft mit der Arbeit an der Anwendung zu beginnen (z. B. dcvetkov ), sagte ich, dass der Code eine vollständige Änderung erfordert. Und bei jedem Versuch, Funktionen zu implementieren oder Fehler zu beheben, wurde ich davon überzeugt. Ich werde Sie darüber informieren, dass das Bearbeiten des Legacy-Codes eine schreckliche Qual ist, insbesondere meine :). Ich hoffe, dass Roboter in Zukunft lernen werden, alles selbst neu zu schreiben, aber vorerst wurde eine willensstarke Entscheidung getroffen, von vorne zu beginnen, wobei bereits gesammelte Erfahrungen beim Erstellen von Programmen und Schreiben von Code berücksichtigt wurden.

Seit seiner ersten Veröffentlichung ist ASH Viewer in diesem Bereich aktiv. Drei ziemlich große Projekte basierend auf JfreeChart für die Datenanalyse wurden durchgeführt. Zusätzlich zu diesen Projekten habe ich verschiedene Ansätze, Paradigmen und Bibliotheken ausprobiert. Aus diesem Grund habe ich beschlossen, dass alles in reinem Java geschrieben werden sollte, ohne dass Bibliotheken verwendet werden müssen, die speziell für die Erstellung einer grafischen Oberfläche von Grund auf neu entwickelt wurden. Die Verwendung von Bibliotheken von Drittanbietern zur Lösung einiger hochspezialisierter Aufgaben ist jedoch durchaus akzeptabel. Auf diese Weise können Sie das erforderliche Maß an Flexibilität beibehalten und müssen nicht viel Zeit in die Behebung von Fehlern und die Entwicklung der erforderlichen Funktionen mit Ihren eigenen Händen investieren.

Wie alles begann


Ich war immer besorgt, aber gibt es ein Beispiel im öffentlichen Bereich, das die Grundlagen für das korrekte Schreiben von Anwendungen mittlerer Komplexität in Java Swing vermittelt? Natürlich haben sie mich in die Bibliothek selbst oder zu einigen einfachen Beispielen aus Lehrbüchern geschickt. Und in gewisser Hinsicht hatten sie recht.

Aber ich habe beharrlich nach Anwendungscode gesucht, der als Beispiel dafür dienen kann, wie man es in Java Swing richtig macht. Und ich wollte ein funktionierendes System vor meinen Augen haben, damit es "gefühlt" werden kann.

Er begann, den Quellcode von Java Swing-Anwendungen zu studieren (alle können nicht gezählt werden). Irgendwo waren sie einfache Aufgaben, irgendwo zu komplex (für mich damals), in einigen versagten sie in der Qualität, und manchmal gab es beides. Ich habe Artikel über Habré gelesen und einen Code geschrieben. Trotzdem fehlte etwas. Vielleicht habe ich damals eine kritische Menge an Wissen gesammelt, um dieses Problem zu lösen.

Eines Tages fand ich den Angry IP Scanner der angesehenen Anton Keks Antonkeks , schaute ihn mir an und merkte sofort - hier ist er! Java Swing, einfache Funktionalität, sauberer Code, Modularität - schön zu lesen! Im Allgemeinen habe ich die darin verwendeten Ansätze verwendet, als ich eines meiner vorherigen Projekte geschrieben und dann ASH Viewer neu geschrieben habe.

Software und Bibliotheken, die zur Verbesserung der Codequalität und zur Vereinfachung der Arbeit beigetragen haben


IDEE : Ich benutze diese IDE seit ungefähr fünf Jahren für die Java-Programmierung. Ich bestätige die Meinung der Mehrheit - dies ist ein wirklich nützliches Programm und ein sehr praktisches Werkzeug zum Schreiben von Code. Als ich von Eclipse www.eclipse.org/ide dorthin wechselte (und die erste Version auf dieser IDE geschrieben wurde), wurde mir nach einem kurzen Training klar, dass IDEA Sie führt und Ihnen sagt, wann Sie versuchen, auf die dunkle Seite zu wechseln :). Das Hervorheben von Wiederholungen im Code hält Sie in guter Form und verhindert, dass Sie dummes Kopieren und Einfügen ausführen. Ave JetBrains!

Java 8 : Lambda-Ausdrücke, mit denen kürzerer Code geschrieben werden kann, eine neue Zeit-API, mit der Sie die Verwendung einer Joda Time-Bibliothek eines Drittanbieters abbrechen können.

Dolch 2 : Abhängigkeitsinjektions-Framework, das ich noch nie verwendet habe. Aber irgendwie habe ich ausspioniert, wie diese Bibliothek von Anton Antonkeks benutzt wird , und habe angefangen, gemäß der Vorlage zu arbeiten. Teilen Sie das Programm nach Möglichkeit in Module ein und verwenden Sie die Abhängigkeitsinjektion. Wo dies nicht möglich war , erstellte er im Voraus Shell-Objekte und stellte dann die erforderlichen Attribute ein oder verwendete DI einfach nicht.

Maven Build System. Dies ist das Build-System, das de facto der Standard ist. Daher habe ich beschlossen, Bibliotheken sauber über pom.xml hinzuzufügen und das Maven-Modulsystem zu verwenden, um mit JFreeChart- und Gantt-Code in einem Projekt zu arbeiten.

Lombok : auch eine unglaublich praktische Bibliothek, um die „Schritte“ des einheitlichen Codes (Getter, Setter usw.) nicht zu schreiben oder zu unterstützen. Zwar habe ich mich in einigen Fällen geweigert, es zu verwenden, da es notwendig war, Gleichheit neu zu definieren und zu vergleichen, aber ich habe in Lombok nicht gefunden, wie ich das schnell machen kann.

Journaling: Das perfekte Java-Programm erstellen? Also, ohne moderne Mittel des Journaling, nirgendwo. Daher nehmen wir die Simple Logging Facade für Java SLF4J und Logback als Basis .

Layout Manager: Ich benutze hauptsächlich Miglayout . Es ist ziemlich schwer zu lernen (an einigen Stellen verwende ich Swing-Layout-Manager auf altmodische Weise), aber es ist kurz. Ermöglicht es Ihnen, so interessante Effekte wie auf der Registerkarte Detail zu erzielen .

Swingx von Swinglabs: Die lange verlassene Java Swing-Benutzeroberfläche wurde beleuchtet. Ich benutze JXTable aktiv. Die willkürliche Auswahl von Tabellenspalten und eine integrierte Suche nach dem Inhalt der Zellen ermöglichen eine detaillierte Analyse der Verlaufsdaten aktiver Sitzungen.

ommons-dbcp2 : nützlich zum Erstellen eines Verbindungspools für Datenbankverbindungen. In der alten Version habe ich eine modifizierte Implementierung verwendet, die ich im Internet gefunden habe.

Bibliotheken, die von der alten Version verschoben wurden


Oracle Berkeley DB Java Edition v. 5.0.73: Eingebetteter Schlüsselwertspeicher. Zum Speichern aggregierter Verlaufsdaten aktiver Sitzungen.

JFreeChart : Tausende von Datenanalyseprojekten, die mit dieser Bibliothek geschrieben wurden. Ich nahm die experimentelle Version, die auf github veröffentlicht ist, und fügte sie als Modul hinzu. Dies wurde durchgeführt, um die Arbeit mit dem Code zu vereinfachen, da Änderungen erforderlich waren , damit das gestapelte Diagramm das Diagramm nach Bedarf anzeigt.

E-Gantt : Eine Bibliothek zum Erstellen von Gantt-Grafiken in Java Swing. Spuren davon können jetzt leider nicht einmal im Internet gefunden werden. Wird auch als separates Maven-Modul im Projekt platziert.

Aus dem im Code Interessanten, worauf Sie achten können


Architektonische Veränderungen:

  1. Jetzt werden die Einstellungen in einer separaten integrierten Datenbank gespeichert, nicht in einfachen Textdateien. Da nicht viele Daten vorhanden sind, wird ein erweitertes EAV- Muster zum Speichern der Verbindungseinstellungen verwendet.
  2. Um Überwachungsdaten zu speichern, habe ich mich für eine OLAP-Engine entschieden. Erstens, um die Anzeige des Gantt-Drilldowns durch SQL_ID / SESSION_ID über den ausgewählten Bereich zu beschleunigen. Zweitens für die Möglichkeit, einen schnellen Drilldown für SQL_ID / SESSION_ID für gestapelte und Gantt-Diagramme zu erhalten. Drittens die Bildung einer zukünftigen Anzeige des Verlaufs aktiver Sitzungen (Top-on-Erwartungen, Drill-on-Erwartungen, Drill-on-SQL_ID / SESSION_ID). Alles wird in einer Entität gespeichert (Daten für eine Sekunde, 15 Sekunden und in Zukunft für andere erweiterte Intervalle werden physisch getrennt);
  3. Ein Nebeneffekt einer sauberen Architektur ist die Fähigkeit, die Überwachung des Verlaufs aktiver Sitzungen anderer Datenbanken zu unterstützen. Derzeit implementierte Postgres-Unterstützung. Um andere Datenbanken zu verbinden, benötigen Sie entweder eine vorgefertigte Schnittstelle zu den Verlaufsdaten aktiver Sitzungen (die Postgres oder einer solchen Implementierung hinzugefügt wurden ) oder eine selbstkonfigurierte Sammlung des Verlaufs aktiver Sitzungen in einer separaten Tabelle, auf die später zugegriffen werden kann.

    So aktivieren Sie die Unterstützung für eine andere Datenbank
    1. Erstellen Sie eine neue Klasse und implementieren Sie die IProfile-Schnittstelle. Machen Sie dasselbe wie im Fall von Postgres;
    2. Fügen Sie die Implementierung für die neue Version der Datenbank zur loadProfile-Prozedur der ConnectToDbArea-Klasse und zur enum-Funktion der ConstantManager- Klasse hinzu.
    3. Verbinden Sie die Anwendung und überprüfen Sie sie.

GUI


Verbindungsformular zur Datenbank

Vollständig von Grund auf neu geschrieben, zuvor die Best Practices aus dem offenen Squirrel-SQL- Projekt verwendet. Jetzt ist alles in einer Datei. Schönheit!



So stellen Sie eine Verbindung zur Datenbank her
  1. Erstellen Sie eine neue Verbindung.
  2. Geben Sie den Namen, die URL (JDBC ist Standard für Oracle: jdbc: oracle: thin: @host: port: SID, für Postgres: jdbc: postgresql: // host: port: database), den Benutzernamen / das Kennwort und das Profil an und wählen Sie die jdbc-Bibliothek aus.
  3. Für Oracle funktioniert alles mit ojdbc6.jar, für PostgresDB wird die Arbeit mit postgresql-42.2.5 überprüft


Top Aktivität / Detail Schnittstelle

Hier ohne wesentliche Änderungen, ähnlich wie in der alten Version, nur ohne die Geschichte anzusehen.



Drill nach SQL_ID / SESSION_ID

SQL



ASH : Aktivitätsdiagramm für eine bestimmte SQL_ID, das durch Doppelklicken auf die Zeile mit SQL_ID aus dem Gantt-Diagramm aufgerufen wird.
SQL-Text / Plan : Für Oracle / Postgres ist es möglich, den vollständigen Text der Anfrage abzurufen . Nur für Oracle werden Abfrageausführungspläne für alle plan_hash_value bereitgestellt.
Statistik : Tabellendaten nach SQL_ID: Abruf aus V $ SQL. Der Code kann weitere Entitäten hinzufügen, für die Sie eine Auswahl treffen können (siehe Implementierung ). Sie müssen jedoch sehr vorsichtig sein, da es zu Leistungsproblemen kommen kann: Das Abrufen von V $ SQLAREA auf geladenen Systemen ist beispielsweise sehr langsam.

Sitzung

ASH : Aktivitätsdiagramm für session_id Doppelklicken Sie ähnlich wie in SQL auf die Sitzungszeile im Gantt-Diagramm.
Statistik : Tabellendaten nach SQL_ID: Abruf von V $ SESSION und V $ PROCESS. Der Code kann weitere Entitäten hinzufügen, für die Sie eine Auswahl treffen können (siehe Implementierung ).

Weitere Pläne


  1. Installieren Sie die API. Führen Sie das endgültige Code-Refactoring durch. Implementieren Sie eine dynamische Speicherung der anfänglichen Überwachungsdaten, die nicht von den Versionen und Typen der Datenbank abhängen würde.
  2. Es gibt wirklich nicht genug Tests, um die Schlüsselmodule des Systems, CI und andere Best Practices zu testen.

Github-Projektcode, Projektdateien;
Link zur Gruppe in Telegram t.me/ashviewer , um über die neuesten Updates zu informieren;

PS Wer beschließt, sich mit der Entwicklung zu verbinden - schreibe an die PM, ohne übermäßige Aufregung und natürlich ohne Schwarm :).

Das ist alles. Vielen Dank für Ihre Aufmerksamkeit!

Source: https://habr.com/ru/post/de441186/


All Articles