Visor de cenizas: reinicio

¬ŅQu√© hacer si necesita trabajar con datos que a√ļn no son Big data por volumen, pero que ya son m√°s de lo que cabe en la memoria de la computadora y para los cuales las caracter√≠sticas de Excel son suficientes? Para los amantes de la bicicleta, la respuesta es obvia: debe escribir algo propio (s√≠, no estamos buscando formas f√°ciles).

Pero, ¬Ņqu√© pasa si el c√≥digo que escribi√≥ en el pasado es terrible y no le da la oportunidad de desarrollar el proyecto? Deje de lado los viejos desarrollos, d√© paso a un nuevo, eterno y brillante (s√≠, s√≠, y aqu√≠ tambi√©n, sin opciones).



Cita de CF Matrix: "Una tableta es suficiente, Neo". Director: hermanos y hermanas Wachowski. 1999. Estados Unidos

Hace m√°s de 10 a√Īos, escrib√≠ un c√≥digo para ASH Viewer (m√°s sobre mi camino aqu√≠ ), lo publiqu√© primero en sourceforge.net , y luego en github para que las personas se conecten y puedan agregar funcionalidad, corregir errores. El proyecto fue construido usando Gradle, resolvi√≥ problemas con la visualizaci√≥n de gr√°ficos: una lista casi completa de mejoras por referencia .

Sin embargo, me di cuenta de que el c√≥digo escrito hace diez a√Īos es, por decirlo suavemente, imperfecto. Exteriormente, todo se ve√≠a bien, la funcionalidad se desarroll√≥, las personas las usaron y agradecieron activamente. Pero dentro del programa conten√≠a todos los errores de la primera experiencia de codificaci√≥n y, por supuesto, esto impidi√≥ en gran medida el desarrollo del proyecto.

A todos los que estaban listos para comenzar a trabajar seriamente en la aplicación (por ejemplo, dcvetkov ), les dije que el código requiere una alteración completa. Y con cada intento de implementar cualquier funcionalidad o corregir errores, me convencí de esto. Te informaré que editar el código heredado es una tortura terrible, especialmente la mía :). Espero que en el futuro los robots aprendan a reescribir todo ellos mismos, pero por ahora, se tomó una decisión decidida de comenzar desde cero, teniendo en cuenta la experiencia ya adquirida en la creación de programas y la escritura de código.

Desde su primer lanzamiento, ASH Viewer ha estado activo en esta √°rea. Se realizaron tres proyectos bastante grandes basados ‚Äč‚Äčen JfreeChart para el an√°lisis de datos. Adem√°s de estos proyectos, prob√© diferentes enfoques, paradigmas y bibliotecas. Como resultado, decid√≠ que todo deber√≠a escribirse en Java puro, sin el uso de bibliotecas especialmente dise√Īadas para crear una interfaz gr√°fica desde cero. Pero a√ļn as√≠, el uso de bibliotecas de terceros para resolver algunas tareas altamente especializadas es bastante aceptable: esto le permitir√° mantener el nivel necesario de flexibilidad y no requerir√° una inversi√≥n significativa de tiempo para corregir errores y desarrollar la funcionalidad requerida con sus propias manos.

Como empezó todo


Siempre estaba preocupado, pero ¬Ņhay alg√ļn ejemplo en el dominio p√ļblico que ofrezca los conceptos b√°sicos para escribir correctamente aplicaciones de complejidad media en Java Swing? Por supuesto, me enviaron a la biblioteca misma oa algunos ejemplos simples de libros de texto. Y de alguna manera ten√≠an raz√≥n.

Pero busqué persistentemente el código de la aplicación que podría usarse como un ejemplo de "cómo hacerlo bien" en Java Swing. Y quería tener un sistema de trabajo ante mis ojos para que se pudiera "sentir".

Comenz√≥ a estudiar el c√≥digo fuente de las aplicaciones Java Swing (no se pueden contar todas). En alg√ļn lugar eran simples tareas pendientes, en alg√ļn lugar demasiado complicado (para m√≠ en ese momento), en algunos fallaron en calidad, y a veces hubo ambos. Le√≠ art√≠culos sobre Habr√©, escrib√≠ un c√≥digo. Pero a√ļn faltaba algo. Quiz√°s en ese momento estaba ganando una cantidad cr√≠tica de conocimiento para resolver este problema.

Un día encontré el Angry IP Scanner de los respetados antonkeks de Anton Keks , lo miré e inmediatamente me di cuenta: ¡aquí está! Java Swing, funcionalidad simple, código limpio, modularidad, ¡agradable de leer! En general, utilicé los enfoques utilizados al escribir uno de mis proyectos anteriores, y luego al reescribir ASH Viewer.

Software y bibliotecas que han ayudado a mejorar la calidad del código y simplificado el trabajo.


IDEA : He estado usando este IDE para la programaci√≥n Java durante unos cinco a√Īos. Confirmo la opini√≥n de la mayor√≠a: este es un programa realmente √ļtil y una herramienta muy conveniente para escribir c√≥digo. Cuando me mud√© a √©l desde Eclipse www.eclipse.org/ide (y la primera versi√≥n fue escrita en este IDE), luego de un breve entrenamiento me di cuenta de que IDEA te gu√≠a y te dice cu√°ndo intentas cambiar al lado oscuro :). Destacar las repeticiones en el c√≥digo lo mantiene en buena forma y le impide hacer est√ļpidos copiar y pegar. Ave JetBrains!

Java 8 : expresiones lambda que permiten escribir código más corto, una nueva API de Time que le permite cancelar el uso de una biblioteca de Joda Time de terceros.

Daga 2 : marco de inyección de dependencia que nunca he usado antes. Pero de alguna manera vi cómo Anton Antonkeks usa esta biblioteca y comencé a hacerlo de acuerdo con la plantilla. Divida el programa en módulos, donde sea posible, use inyección de dependencia. Cuando esto no fue posible , utilizó la creación de objetos de shell por adelantado, y luego estableció los atributos necesarios o simplemente no usó DI.

Sistema de construcción Maven . Este es el sistema de compilación que es el estándar de facto, así que decidí agregar bibliotecas limpiamente a través de pom.xml y usar el sistema de módulos Maven para trabajar con código JFreeChart y Gantt en un proyecto.

Lombok : también una biblioteca increíblemente conveniente, para no escribir o apoyar los "pasos" del código uniforme (getters, setters, etc.). Es cierto que en algunos casos me negué a usarlo, ya que era necesario redefinir iguales y compareTo, pero no encontré cómo hacerlo rápidamente en Lombok.

Diario: hacer el programa Java perfecto? Por lo tanto, sin medios modernos de diario, en ninguna parte. Por lo tanto, tomamos como base la Simple Logging Facade para Java SLF4J y Logback .

Administrador de dise√Īo: principalmente uso Miglayout . Es bastante dif√≠cil de aprender (en algunos lugares uso los administradores de dise√Īo de Swing a la antigua usanza), pero es breve. Le permite hacer efectos tan interesantes como en la pesta√Īa Detalle.

Swingx de Swinglabs: la interfaz de usuario Java Swing abandonada hace mucho tiempo se ilumin√≥. Estoy usando JXTable activamente. La selecci√≥n arbitraria de las columnas de la tabla y una b√ļsqueda integrada del contenido de las celdas facilitan un an√°lisis detallado de los datos hist√≥ricos de las sesiones activas.

ommons-dbcp2 : √ļtil para crear un grupo de conexiones para conexiones de bases de datos. En la versi√≥n anterior, utilizaba una implementaci√≥n modificada que encontr√© en Internet.

Bibliotecas que pasaron de la versión anterior


Oracle Berkeley DB Java Edition v. 5.0.73: almacenamiento de clave-valor incrustado. Para almacenar datos de historial agregados de sesiones activas.

JFreeChart : Miles de proyectos de an√°lisis de datos escritos con esta biblioteca. Tom√© la versi√≥n experimental, que est√° publicada en github, y la agregu√© como un m√≥dulo. Esto se hizo para la conveniencia de trabajar con el c√≥digo, ya que se requer√≠an cambios para que el Gr√°fico apilado mostrara el gr√°fico seg√ļn fuera necesario.

E-Gantt : una biblioteca para crear gráficos Gantt en Java Swing. Las huellas de esto ahora no se pueden encontrar incluso en Internet, por desgracia. También se coloca como un módulo Maven separado en el proyecto.

De lo interesante en el código, a qué puedes prestar atención


Cambios arquitectónicos:

  1. Ahora la configuración se almacena en una base de datos integrada separada, no en archivos de texto sin formato. Como no hay muchos datos, se utiliza un patrón EAV avanzado para almacenar la configuración de conexión;
  2. Para almacenar datos de monitoreo, decidí hacer una apariencia de un motor OLAP. Primero, para acelerar la visualización del desglose de Gantt por SQL_ID / SESSION_ID sobre el rango seleccionado. En segundo lugar, para la posibilidad de obtener un desglose rápido en SQL_ID / SESSION_ID en gráficos apilados y Gantt. En tercer lugar, la formación de una visión futura del historial de sesiones activas (Top en expectativas, profundizar en expectativas, profundizar en SQL_ID / SESSION_ID). Todo se almacena en una entidad (los datos para un segundo, 15 segundos y, en el futuro, para otros intervalos extendidos están físicamente separados);
  3. Un efecto secundario de la arquitectura limpia es la capacidad de soportar el monitoreo del historial de sesiones activas de otras bases de datos. Actualmente implementado soporte Postgres. Para conectar otras bases de datos, necesita una interfaz preparada para los datos del historial de sesiones activas (que se agregó a Postgres o una implementación de este tipo ) o una colección autoconfigurada del historial de sesiones activas en una tabla separada, a la que se puede acceder más adelante.

    Cómo habilitar el soporte para otra base de datos
    1. Cree una nueva clase e implemente la interfaz IProfile. Haga lo mismo que en el caso de Postgres;
    2. Agregue la implementación para la nueva versión de la base de datos al procedimiento loadProfile de la clase ConnectToDbArea y la función enum de la clase ConstantManager ;
    3. Conéctese y verifique la aplicación.

GUI


Formulario de conexión a la base de datos.

Completamente reescrito desde cero, utilizó previamente las mejores prácticas del proyecto abierto Squirrel-sql . Ahora todo está en un archivo. Belleza!



Cómo conectarse a la base de datos
  1. Crea una nueva conexión;
  2. Especifique el nombre, URL (JDBC es est√°ndar para Oracle: jdbc: oracle: thin: @host: port: SID, para Postgres: jdbc: postgresql: // host: port: database), nombre de usuario / contrase√Īa, perfil y seleccione la biblioteca jdbc;
  3. Para Oracle, todo funciona con ojdbc6.jar; para PostgresDB, se verifica el trabajo con postgresql-42.2.5


Actividad principal / Interfaz de detalle

Aquí, sin cambios significativos, similar a la versión anterior, solo sin ver la historia.



Explorar por SQL_ID / SESSION_ID

SQL



ASH : gráfico de actividad para un SQL_ID específico, llamado haciendo doble clic en la fila con SQL_ID del gráfico de Gantt.
Texto / plan SQL : para Oracle / Postgres es posible obtener el texto completo de la solicitud. Solo para Oracle se proporcionan planes de ejecución de consultas para todo plan_hash_value.
Estadísticas : datos de la tabla por SQL_ID: buscar desde V $ SQL. El código tiene la capacidad de agregar más entidades para las cuales puede hacer una selección (ver implementación ). pero debe tener mucho cuidado, ya que puede haber problemas de rendimiento: por ejemplo, la recuperación de V $ SQLAREA en sistemas cargados es muy lenta).

Sesión

ASH : gráfico de actividad para session_id, de manera similar a SQL, haga doble clic en la línea de sesión desde el gráfico de Gantt.
Estadísticas : datos de la tabla por SQL_ID: obtener de V $ SESSION y V $ PROCESS. El código tiene la capacidad de agregar más entidades para las cuales puede hacer una selección (ver implementación ).

Planes adicionales


  1. Instala la API. Realizar la refactorización del código final. Implemente el almacenamiento dinámico de los datos de monitoreo iniciales, que no dependerían de las versiones y tipos de la base de datos;
  2. Realmente no hay suficientes pruebas para probar los módulos clave del sistema, CI y otras mejores prácticas.

Código de proyecto Github, archivos de proyecto;
Enlace al grupo en Telegram t.me/ashviewer para informar sobre las √ļltimas actualizaciones;

PD: ¬ŅQui√©n decide conectarse con el desarrollo? Escriba al PM, sin demasiada emoci√≥n y sin crear un flechazo, por supuesto :).

Eso es todo. Gracias por su atencion!

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


All Articles