Visionneuse ASH: redémarrage

Que faire si vous devez travailler avec des données qui ne sont pas encore des données volumineuses en volume, mais déjà plus que ce qui tient dans la mémoire de l'ordinateur et pour lesquelles les fonctionnalités d'Excel suffisent? Pour les amateurs de vélo, la réponse est évidente: vous devez écrire quelque chose de vous-même (oui, nous ne cherchons pas de moyens faciles).

Mais que se passe-t-il si le code que vous avez écrit dans le passé est terrible et ne vous donne pas la possibilité de développer le projet? Mettre de côté les anciens développements, laisser la place à un nouveau, éternel et lumineux (oui, oui, et ici aussi, sans options).



Citation de CF Matrix: "Une tablette suffit, Neo." Réalisateur: frères et sœurs Wachowski. 1999. USA

Il y a plus de 10 ans, j'ai écrit du code pour ASH Viewer (plus d'informations sur mon chemin ici ), je l'ai d'abord publié sur sourceforge.net , puis sur github pour que les gens se connectent et puissent ajouter des fonctionnalités, corriger les erreurs. Le projet a été construit en utilisant Gradle, des problèmes résolus avec l'affichage des graphiques: une liste presque complète des améliorations par référence .

Cependant, j'ai réalisé que le code écrit il y a dix ans est, pour le moins, imparfait. Extérieurement, tout avait l'air bien, la fonctionnalité a été développée, les gens activement utilisés et remerciés. Mais à l'intérieur du programme contenait toutes les erreurs de la première expérience de codage et, bien sûr, cela a grandement entravé le développement du projet.

À tous ceux qui étaient prêts à commencer sérieusement à travailler sur l'application (par exemple, dcvetkov ), j'ai dit que le code nécessitait une modification complète. Et à chaque tentative d'implémentation d'une fonctionnalité ou de correction de bugs, j'en suis devenu convaincu. Je vous informe que la modification du code hérité est une terrible torture, surtout la mienne :). J'espère qu'à l'avenir les robots apprendront à tout réécrire eux-mêmes, mais pour l'instant, une décision résolue a été prise de partir de zéro, en tenant compte de l'expérience déjà acquise dans la création de programmes et l'écriture de code.

Depuis sa première version, ASH Viewer est actif dans ce domaine. Trois projets assez importants basés sur JfreeChart pour l'analyse des données ont été réalisés. En plus de ces projets, j'ai essayé différentes approches, paradigmes et bibliothèques. En conséquence, j'ai décidé que tout devait être écrit en Java pur, sans utiliser de bibliothèques spécialement conçues pour créer une interface graphique à partir de zéro. Mais tout de même, l'utilisation de bibliothèques tierces pour résoudre certaines tâches hautement spécialisées est tout à fait acceptable - cela vous permettra de maintenir le niveau de flexibilité nécessaire et ne nécessitera pas un investissement important en temps pour corriger les bogues et développer les fonctionnalités requises de vos propres mains.

Comment tout a commencé


J'étais toujours inquiet, mais y a-t-il un exemple dans le domaine public qui donnerait les bases d'une écriture correcte d'applications de complexité moyenne en Java Swing? Bien sûr, ils m'ont envoyé à la bibliothèque elle-même ou à quelques exemples simples de manuels. Et à certains égards, ils avaient raison.

Mais j'ai constamment cherché du code d'application qui pourrait être utilisé comme un exemple de «comment le faire correctement» dans Java Swing. Et je voulais avoir un système de travail devant mes yeux afin qu'il puisse être "ressenti".

Il a commencé à étudier le code source des applications Java Swing (toutes ne peuvent pas être comptées). Quelque part, ils étaient simples ToDo, quelque part trop compliqué (pour moi à l'époque), dans certains, ils ont échoué en qualité, et parfois il y avait les deux. J'ai lu des articles sur Habré, écrit un code. Mais il manquait encore quelque chose. Peut-être qu'à ce moment-là, je gagnais une quantité critique de connaissances pour résoudre ce problème.

Un jour, j'ai trouvé le scanner IP en colère des antonkeks respectés d'Anton Keks, je l'ai regardé et j'ai immédiatement réalisé - le voici! Java Swing, fonctionnalité simple, code propre, modularité - agréable à lire! En général, j'ai utilisé les approches utilisées lors de l'écriture de l'un de mes projets précédents, puis lors de la réécriture de ASH Viewer.

Logiciels et bibliothèques qui ont contribué à améliorer la qualité du code et simplifié le travail


IDÉE : J'utilise cet IDE pour la programmation Java depuis environ cinq ans maintenant. Je confirme l'opinion de la majorité - c'est un programme vraiment utile et un outil très pratique pour écrire du code. Lorsque je suis passé à Eclipse sur www.eclipse.org/ide (et la première version a été écrite sur cet IDE), puis après une courte formation, j'ai réalisé que IDEA vous guide et vous dit quand vous essayez de passer du côté obscur :). La mise en évidence des répétitions dans le code vous maintient en bonne forme et vous empêche de faire un copier-coller stupide. Ave JetBrains!

Java 8 : expressions lambda qui permettent d'écrire du code plus court, une nouvelle API Time qui vous permet d'annuler l'utilisation d'une bibliothèque Joda Time tierce.

Dague 2 : Framework d'injection de dépendances que je n'ai jamais utilisé auparavant. Mais d'une manière ou d'une autre, j'ai espionné comment cette bibliothèque est utilisée par Anton antonkeks , et j'ai commencé à le faire selon le modèle. Divisez le programme en modules, si possible, utilisez l'injection de dépendances. Lorsque cela n'était pas possible , il a utilisé la création d'objets shell à l'avance, puis il a défini les attributs nécessaires ou n'a tout simplement pas utilisé DI.

Système de construction Maven . C'est le système de construction qui est la norme de facto, j'ai donc décidé d'ajouter proprement des bibliothèques via pom.xml et d'utiliser le système de modules Maven pour travailler avec JFreeChart et le code Gantt dans un projet.

Lombok : également une bibliothèque incroyablement pratique, afin de ne pas écrire ou soutenir les «traces» de code uniforme (getters, setters, etc.). Certes, dans certains cas, j'ai refusé de l'utiliser, car il était nécessaire de redéfinir des égaux et de comparer To, mais je n'ai pas trouvé comment le faire rapidement à Lombok.

Journalisation: faire le programme Java parfait? Donc, sans moyens modernes de journalisation, nulle part. Par conséquent, nous prenons la façade de journalisation simple pour Java SLF4J et Logback comme base .

Gestionnaire de mise en page: J'utilise principalement Miglayout . C'est assez difficile à apprendre (dans certains endroits, j'utilise les gestionnaires de disposition Swing à l'ancienne), mais c'est court. Vous permet de faire des effets aussi intéressants que sur l'onglet Détail.

Swingx par Swinglabs: l'interface utilisateur Java Swing abandonnée depuis longtemps. J'utilise activement JXTable. La sélection arbitraire des colonnes du tableau et une recherche intégrée du contenu des cellules facilitent une analyse détaillée des données d'historique des sessions actives.

ommons-dbcp2 : utile pour créer un pool de connexions pour les connexions aux bases de données. Dans l'ancienne version, j'utilisais une implémentation modifiée que j'ai trouvée sur Internet.

Bibliothèques qui sont passées de l'ancienne version


Oracle Berkeley DB Java Edition v. 5.0.73: stockage clé-valeur intégré. Pour stocker les données d'historique agrégées des sessions actives.

JFreeChart : des milliers de projets d'analyse de données écrits à l'aide de cette bibliothèque. J'ai pris la version expérimentale, qui est publiée sur github, et je l'ai ajoutée en tant que module. Cela a été fait pour la commodité de travailler avec le code, car des modifications étaient nécessaires pour que le graphique empilé affiche le graphique selon les besoins.

E-Gantt : une bibliothèque pour créer des graphiques Gantt dans Java Swing. Des traces de celui-ci ne peuvent pas être trouvées même sur Internet, hélas. Également placé en tant que module Maven distinct dans le projet.

De l'intéressant dans le code, ce à quoi vous pouvez faire attention


Changements architecturaux:

  1. Désormais, les paramètres sont stockés dans une base de données intégrée distincte, et non dans des fichiers en texte brut. Comme il n'y a pas beaucoup de données, un modèle EAV avancé est utilisé pour stocker les paramètres de connexion;
  2. Pour stocker les données de surveillance, j'ai décidé de faire un semblant de moteur OLAP. Tout d'abord, pour accélérer l'affichage de l'exploration Gantt par SQL_ID / SESSION_ID sur la plage sélectionnée. Deuxièmement, pour la possibilité d'obtenir une exploration rapide sur SQL_ID / SESSION_ID sur les graphiques empilés et Gantt. Troisièmement, la formation de la visualisation future de l'historique des sessions actives (Top sur les attentes, drill sur les attentes, drill sur SQL_ID / SESSION_ID). Tout est stocké dans une entité (les données pour une seconde, 15 secondes et, à l'avenir, pour d'autres intervalles prolongés sont physiquement séparées);
  3. Un effet secondaire d'une architecture propre est la capacité à prendre en charge la surveillance de l'historique des sessions actives d'autres bases de données. Support Postgres actuellement implémenté. Pour connecter d'autres bases de données, vous avez besoin soit d'une interface prête à l'emploi pour les données d'historique des sessions actives (qui a été ajoutée à Postgres ou à une telle implémentation ), soit d'une collection auto-configurée de l'historique des sessions actives dans une table distincte, accessible ultérieurement.

    Comment activer la prise en charge d'une autre base de données
    1. Créez une nouvelle classe et implémentez l'interface IProfile. Faites de même que dans le cas de Postgres;
    2. Ajoutez l'implémentation de la nouvelle version de la base de données à la procédure loadProfile de la classe ConnectToDbArea et à la fonction enum de la classe ConstantManager ;
    3. Connectez-vous et vérifiez l'application.

GUI


Formulaire de connexion à la base de données

Entièrement réécrit à partir de zéro, utilisait auparavant les meilleures pratiques du projet open Squirrel-sql . Maintenant, tout est dans un seul fichier. La beauté!



Comment se connecter à la base de données
  1. Créez une nouvelle connexion;
  2. Spécifiez le nom, l'URL (JDBC est standard pour Oracle: jdbc: oracle: thin: @host: port: SID, pour Postgres: jdbc: postgresql: // host: port: base de données), nom d'utilisateur / mot de passe, profil et sélectionnez la bibliothèque jdbc;
  3. Pour Oracle, tout fonctionne avec ojdbc6.jar; pour PostgresDB, le travail avec postgresql-42.2.5 est vérifié


Interface activité / détail

Ici, sans changements importants, semblable à l'ancienne version, seulement sans visionner l'histoire.



Exploration par SQL_ID / SESSION_ID

SQL



ASH : graphique d'activité pour un SQL_ID spécifique, appelé en double-cliquant sur la ligne avec SQL_ID du Gantt-graph.
Texte / plan Sql : pour Oracle / Postgres, il est possible d'obtenir le texte intégral de la demande. Uniquement pour Oracle, les plans d'exécution des requêtes sont fournis pour toutes les valeurs plan_hash_value.
Statistiques : données de table par SQL_ID: récupération à partir de V $ SQL. Le code a la possibilité d'ajouter plus d'entités pour lesquelles vous pouvez faire une sélection (voir implémentation ). mais vous devez être très prudent, car il peut y avoir des problèmes de performances: par exemple, la récupération à partir de V $ SQLAREA sur les systèmes chargés est très lente).

Séance

ASH : graphique d'activité pour session_id, de la même manière que SQL, double-cliquez sur la ligne de session du graphique de Gantt.
Statistiques : données de table par SQL_ID: extraction à partir de V $ SESSION et V $ PROCESS. Le code a la possibilité d'ajouter plus d'entités pour lesquelles vous pouvez faire une sélection (voir implémentation ).

Plans supplémentaires


  1. Installez l'API. Effectuer la refactorisation finale du code. Mettre en œuvre un stockage dynamique des données de surveillance initiales, qui ne dépendrait pas des versions et des types de la base de données;
  2. Il n'y a vraiment pas assez de tests pour tester les modules clés du système, CI et autres meilleures pratiques.

Code de projet Github, fichiers de projet;
Lien vers le groupe dans Telegram t.me/ashviewer pour informer sur les dernières mises à jour;

PS Qui décide de se connecter au développement - écrivez au PM, sans excitation excessive et sans créer de béguin, bien sûr :).

C’est tout. Merci de votre attention!

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


All Articles