Publicité
Publicité

Contenu connexe

Publicité

SEVILLA Meetups23032023.pdf

  1. FRANCISCO JAVIER TOSCANO LOPEZ 23/03/2023 https://github.com/fjtoscano/meetuprelationaldb SEVILLA MuleSoft Meetup Group
  2. Who am I? 2 ● Soy un gaditano que emigró hace ya casi 20 años a Sevilla donde resido actualmente. ● Llevo casi 20 años como Arquitecto Java, experto en arquitecturas de Microservicios basadas en Spring Boot y que hace 5 años tuvo la oportunidad de conocer Mulesoft. ● Desde entonces, llevo ayudando a diseñar arquitecturas de integración utilizando toda la potencia que nos ofrece Mulesoft. ● Porque Mulesoft?, porque al estar basado en Java me permitió conocer todos su potencial desde el minuto uno , y me ayudo a entender mejor como funciona por dentro. Javier Toscano Lopez, Chief Architect, NTT Data https://www.linkedin.com/in/francisco-javier-toscano- lopez-1815919/ @fjtoscano 2
  3. 3 Agenda • Como se integra Java con Bases de Datos relacionales • Somos los integradores DBA? Pide ayuda !!!! • Pool de conexiones, que es y para que sirve • ApiKit Odata, generación automática de API´s a partir de fuentes de datos • Historias para no dormir y casos extraños • Mesa redonda.
  4. All contents © MuleSoft, LLC Como se integra Java con Bases de Datos relacionales
  5. 5 Bases de Datos • Definición: Las bases de datos son sistemas de información capaces de almacenar grandes cantidades de información de manera organizada. Relacionales: • Colección de elementos de datos organizados en un conjunto de tablas formalmente descritas. • SQL: lenguaje estándar de consultas No Relacionales: • Esquemas flexibles • No tienen identificador para asociar datos
  6. 6 Java y las Bases de Datos Java se puede comunicar con las BDs a través de librerías llamadas JDBC JDBC CADENA DE CONEXION • Url JDBC de conexión • Identificación del usuario • Query a ejecutar APERTURA DE CONEXIÓN • Creación de un objeto connection, con la cadena de conexión • Ejecución de la query • Tratamiento de resultados • Cierre de la conexión
  7. 7 Java y las Bases de Datos Open Close Transactional Operation
  8. 8 La evolución: persistencia y transaccionalidad Para abstraer de la programación en SQL a los desarrolladores Java se crea la tecnología de persistencia en BD, donde: • Se utilizan clases Java “Entidades” que representan las tablas de BD, y donde sus atributos son las columnas de dichas tablas. • Se utiliza MyBatis, hibernate, o Spring Data como ejemplos de motores de persistencia. • Se crea el concepto de transaccionalidad @Transactional, donde se controla el canuto de conexión con la BD. Solo cuando termina el método es cuando se ejecuta todas las ordenes SQL @Service @Transactional public class CustomerService { private final CustomersRepository customersRepository; @Autowired public this.cusCustomerService(final CustomersRepository customersRepository) {tomersRepository = customersRepository; } public Customer findById(final long id) { final CustomerEntity customer = customersRepository.findOne(id); if (customer == null) { throw new CustomerNotFoundException(); } final Customer dto = new Customer(); dto.setFirstName(customer.getFirstName()); dto.setLastName(customer.getLastName()); dto.setEmail(customer.getEmail()); return dto; } @Entity @Table(name = "customer") public class CustomerEntity { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(name = "first_name", nullable = false) private String firstName; @Column(name = "last_name", nullable = false) private String lastName; @Column(nullable = false) private String email;
  9. All contents © MuleSoft, LLC Somos los integradores, DBA? Pide ayuda a alguien que sepa de BD !!!
  10. 10 Conector de Base de Datos de MuleSoft • MuleSoft utiliza el Database Connector, para conectarse a cualquier tipo de BD del que exista librería JDBC • Utiliza el método mas antiguo, el método JDBC connection, donde el desarrollador de integración tiene que saber de SQL para poder interactuar con la BD • Por lo general el desarrollador de integración no tiene porque saber hacer consultas complejas a BD y es por ellos, que se puede caer en un mal uso del conector de BD
  11. 11 Conector de Base de Datos de MuleSoft – Conexion • Configuración inline de conexión a BD
  12. 12 Conector de Base de Datos de MuleSoft – Conexión por bean de Spring • Configuración referenciando un bean de Spring
  13. 13 Conector de Base de Datos - Operaciones El conector de BD nos permite realizar muchas operaciones sobre las BD, pero las principales son: • Select, Insert, Update, Delete: CRUD de operaciones normales sobre las tablas • Bulk Insert, Update, Delete: CRUD de operaciones con datos masivos • On Table Row: Disparador que activa el flujo de mule cuando algo cambia en la tabla de la BD • Stored procedure: En los sistemas de BD que lo permitan, este componente hace llamadas a los Procedure o Function de la BD • Execute script o DDL: Permiten ejecutar lenguaje DDL que es capaz de construir elementos como tablas en BBDD.
  14. 14 Conector de Base de Datos - Ejemplos
  15. 15 Conector de Base de Datos – Stored Procedure y UDT • Algunas BD relacionales como ORACLE, SQL Server, Mysql o PostGreSQL son capaces de ejecutar código programático denominado PL/SQL • PL/SQL se agrupa en forma de Funciones y Procedimientos que pueden ser llamados desde MuleSoft • La operación Stored Procedure, hacen referencia a la interacción de MuleSoft con los PROCEDURE y FUNCTION de las BD relacionales. • UDT (User Defined Types) son objetos creados dentro de ORACLE y que sirven como parámetros en los procedimientos, funciones, cursores,….
  16. 16 Conector de Base de Datos – Stored Procedure y UDT 1.- Se crean 4 tipos de objetos PHONE_NUMBER PHONE_NUMBER_ARRAY PERSON PEOPLE 2.- Se crea una tabla HUMANS, con tipos nativos y tipos compuestos 3.- Finalmente se crea un procedimiento para insertar registros en la tabla HUMANS https://docs.mulesoft.com/db- connector/1.14/database-connector-udt-stored- procedure
  17. 17 Conector de Base de Datos – Stored Procedure y UDT %dw 2.0 output application/java fun toPhoneNumberArray(phoneNumber) = Db::createArray("Database_Config", "PHONE_NUMBER_ARRAY",[Db::createStruct("Database_Config", "PHONE_NUMBER", [phoneNumber.areaCode, phoneNumber.phoneNumber])]) fun toPerson(person) = Db::createStruct("Database_Config", "PERSON", [person.name, person.surname, person.age, toPhoneNumberArray(person.phoneNumber)]) --- Db::createArray("Database_Config", "PEOPLE", payload map (item, index) -> (toPerson(item)) )
  18. 18 Conector de Base de Datos – Stored Procedure y UDT %dw 2.0 output application/java fun toPhoneNumberArray(phoneNumber) = Db::createArray("Database_Config","PHONE_NUMBER_ARRAY",[Db::createStruct("Database_Config", "PHONE_NUMBER", [phoneNumber.areaCode, phoneNumber.phoneNumber])]) fun toPerson(person) = Db::createStruct("Database_Config", "PERSON", [person.name, person.surname, person.age, toPhoneNumberArray(person.phoneNumber)]) --- Db::createArray("Database_Config", "PEOPLE", payload map (item, index) -> (toPerson(item)) )
  19. 19 Conector de Base de Datos – Recomendaciones de uso • SELECT Y FOR EACH: Existen múltiples formas de conseguir los datos de una BD con select anidadas y complejas, si no sabes pregunta a alguien que sepa. • Cada componente de BD abre una conexión con la BD y esto consume muchos recursos y tiempos de respuesta, limítalas todo los posible, utilizando correctamente las operaciones. • UDT SP: La codificación de los colum type en el DataBase Config esta en https://docs.mulesoft.com/db-connector/0.3.9/database-connector-reference#data- types-example • UDT SP: El tratamiento de datos complejos en DataWeave es costoso en tiempo de ejecución, es decir cuando el flujo del API entra en el trasform Message que crea los UDT este proceso tarda mucho en MuleSoft y puede aumentar mucho el tiempo de respuesta del API. • UDT SP: Intentar utilizar datos nativos como parámetros en los stored procedure
  20. All contents © MuleSoft, LLC Pool de conexiones, que es y para que sirve
  21. 21 Pool de conexiones Definición: Un pool de conexiones es un conjunto limitado de conexiones a una base de datos, que es manejado por un servidor de aplicaciones de forma tal, que dichas conexiones pueden ser reutilizadas por los diferentes usuarios. • El componente de Database de MuleSoft, por defecto no tiene configurado el pool de conexiones, por lo que cada vez que se conecta a la BD abre y cierra una conexión, consumiendo mucha memoria.
  22. 22 Pool de conexiones – como se configura? • Max pool size: Numero máximo de conexiones concurrentes • Min pool size: Numero mínimo de conexiones abiertas • Acquire Increment: Determina cuantas conexiones a la vez puede coger cuando el pool está agotado • Prepared Statement Cache Size: Determina cuántas declaraciones se almacenan en caché por conexión agrupada. Establecer esto en cero desactiva el almacenamiento en caché de la instrucción • Max Wait: La cantidad de tiempo que un cliente que intenta obtener una conexión espera a que se adquiera cuando se agota el pool. Establecer este valor en cero (predeterminado) significa esperar indefinidamente • Max Idle Time: Determina cuántos segundos una conexión puede permanecer en pool, pero sin usar antes de ser descartada. Establecer este valor en cero (por defecto) significa que las conexiones inactivas nunca caducan.
  23. 23 Pool de conexiones – para que sirve y recomendaciones • Aprovechar los recursos de memoria y CPU del API • Aprovechar los recursos del pool de conexiones del servidor de base de datos • Antes de setear los datos en la Global Element de MuleSoft, es necesario que se hable con el gestor de la BD para saber las características del pool de conexiones que tiene el Servidor de Base de Datos • Es recomendable siempre dejar el valor de Min pool size como mínimo a 1, ya que mantiene siempre abierta una conexión a la BD para que no se cierre dicha conexión y consuma mas recursos de los que debe
  24. All contents © MuleSoft, LLC OData ApiKit
  25. 25 OData • OData es un protocolo para la creación de APIs tipo REST a partir de fuentes de datos diversas como Bases de Datos, CRM como Salesforce, o SAP. • OData ApiKit de MuleSoft es la herramienta para poder crear a partir de un fichero EDM (Entity Data Model) un conjunto de operaciones CRUD API Rest para poder gestionar a través de las mismas los datos de la fuente. • Permite mediante API Rest, realizar operaciones similares a las que se haría con SQL, como filtros en búsquedas, ordenación, insert, update, … EDM / OData GET POST PATCH PUT DELETE
  26. 26 Odata - EDM • Un fichero EDM o Entity Data Model, es un fichero en formato XML que contiene la estructura de los datos con sus atributos y tipos. 1.- Descripción de entidad 2.- Clave primaria de la entidad 3.- Conjunto de entidades que se van a exponer 4.- Relación entre entidades
  27. 27 Odata – EDM – Generación desde RAML • Un fichero EDM se puede crear a partir de un RAML tipo Library que contenga el tipo de datos que se va a utilizar en un API
  28. 28 Odata – APIKit MuleSoft • Crear un nuevo proyecto • Copiamos el fichero edm (odata-metadata.csdl.xml) a la carpeta /src/main/resources/api • Sobre el fichero edm pulsamos botón derecho Mule -> Generate Mule Odata 4 API • Esto nos genera el flujo principal que con el componente Route • Por cada Entidad: 1.- Tenemos los flujos GET, POST, PUT, PATCH y DELETE 2.- Tenemos opciones para poder realizar búsquedas con diferentes operadores $select, $orderby, $count • El componente Transform to SQL Select, nos construye la operación el Select a partir de los query parameters específicos del estándar Odata
  29. 29 Odata – Transform to SQL Select • Dentro del componente OData existe una operación muy interesante que convierte los parámetros y atributos HTTP de una petición en una sentencia SQL
  30. All contents © MuleSoft, LLC Historias para no dormir y casos extraños
  31. 31 Casos extraños – Dejando conexiones abiertas PROBLEMA: Cuando se utiliza el Stored Procedure del componente Database, se quedan las conexiones abiertas y bloqueadas en la BD, de forma que cuando se llega al máximo de conexiones configuradas en el Pool de conexiones el API deja de poder llamar a la BD. CAUSA: La causa es conocida por MuleSoft pero no es algo que pase siempre por este motivo no se ha solucionado el problema a día de hoy. SOLUCION Es necesario cubrir el componente Stored Procedure con una componente try e indicar en el componente try el tipo de Transactional action en ALWAYS_BEGIN. Esto lo que hace es forzar que la transacción se abra y se cierre en el momento y así desbloquea el hilo cuando termina el stored procedure de ejecutarse.
  32. 32 Casos extraños – Envío de parámetros vacíos ??? PROBLEMA: BD ORACLE - Cuando un componente Stored Procedure envía los parámetros vacíos o null a la BD y cuando se hace debug el valor que aparece es "???” CAUSA: El charset en el que está desplegado la BD, cuando se trata de Charset Americanos u otros que no sigan el estándar ISO SOLUCION Esto se soluciona de una forma “muy sencilla” pero que ni MuleSoft sabia, y es añadiendo una librería que complementa los charset que contiene la librería ojdbc8.jar a la hora de conectarse con las BD, esta librería es la orai18n.jar.
  33. Thank you https://github.com/fjtoscano/meetuprelationaldb
Publicité