SlideShare ist ein Scribd-Unternehmen logo
1 von 33
Downloaden Sie, um offline zu lesen
FRANCISCO JAVIER TOSCANO LOPEZ
23/03/2023
https://github.com/fjtoscano/meetuprelationaldb
SEVILLA MuleSoft Meetup Group
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
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.
All contents © MuleSoft, LLC
Como se integra Java con Bases de Datos
relacionales
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
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
Java y las Bases de Datos
Open
Close
Transactional
Operation
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;
All contents © MuleSoft, LLC
Somos los integradores, DBA?
Pide ayuda a alguien que sepa de BD !!!
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
Conector de Base de Datos de MuleSoft –
Conexion
• Configuración inline de conexión a BD
12
Conector de Base de Datos de MuleSoft –
Conexión por bean de Spring
• Configuración referenciando un bean
de Spring
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
Conector de Base de Datos - Ejemplos
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
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
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
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
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
All contents © MuleSoft, LLC
Pool de conexiones, que es y para que sirve
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
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
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
All contents © MuleSoft, LLC
OData ApiKit
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
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
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
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
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
All contents © MuleSoft, LLC
Historias para no dormir y casos extraños
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
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.
Thank you
https://github.com/fjtoscano/meetuprelationaldb

Weitere ähnliche Inhalte

Ähnlich wie SEVILLA Meetups23032023.pdf

curso-servidores-apache-2
curso-servidores-apache-2curso-servidores-apache-2
curso-servidores-apache-2
greenpeans
 
Patrones de arquitectura Software(Capa de Datos)
Patrones de arquitectura Software(Capa de Datos)Patrones de arquitectura Software(Capa de Datos)
Patrones de arquitectura Software(Capa de Datos)
josecuartas
 
cuadro_comparativo_SGBD_top_10.docx (1).docx
cuadro_comparativo_SGBD_top_10.docx (1).docxcuadro_comparativo_SGBD_top_10.docx (1).docx
cuadro_comparativo_SGBD_top_10.docx (1).docx
Igor Rodriguez
 
Portabilidad y transportabilidad
Portabilidad y transportabilidadPortabilidad y transportabilidad
Portabilidad y transportabilidad
juanmanuelsalgado
 
Reportes En J Developer Parte 1 Y 2
Reportes En J Developer   Parte 1 Y 2Reportes En J Developer   Parte 1 Y 2
Reportes En J Developer Parte 1 Y 2
Steven Gomez
 

Ähnlich wie SEVILLA Meetups23032023.pdf (20)

curso-servidores-apache-2
curso-servidores-apache-2curso-servidores-apache-2
curso-servidores-apache-2
 
Personalización Data Collectors
Personalización Data CollectorsPersonalización Data Collectors
Personalización Data Collectors
 
Azure DataFactory
Azure DataFactoryAzure DataFactory
Azure DataFactory
 
Migrando mis datos a la nube con Azure Data Factory
Migrando mis datos a la nube con Azure Data FactoryMigrando mis datos a la nube con Azure Data Factory
Migrando mis datos a la nube con Azure Data Factory
 
servlets
servlets servlets
servlets
 
Patrones de arquitectura Software(Capa de Datos)
Patrones de arquitectura Software(Capa de Datos)Patrones de arquitectura Software(Capa de Datos)
Patrones de arquitectura Software(Capa de Datos)
 
Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2
 
Programacion de base de datos - unidad 3 Programacion de base de datos
Programacion de base de datos - unidad 3 Programacion de base de datosProgramacion de base de datos - unidad 3 Programacion de base de datos
Programacion de base de datos - unidad 3 Programacion de base de datos
 
sesion 01_sql basico.pdf
sesion 01_sql basico.pdfsesion 01_sql basico.pdf
sesion 01_sql basico.pdf
 
Guía Practica conexión BD 2021
Guía Practica conexión BD  2021Guía Practica conexión BD  2021
Guía Practica conexión BD 2021
 
cuadro_comparativo_SGBD_top_10.docx (1).docx
cuadro_comparativo_SGBD_top_10.docx (1).docxcuadro_comparativo_SGBD_top_10.docx (1).docx
cuadro_comparativo_SGBD_top_10.docx (1).docx
 
Vistazo a SQL Server 2016
Vistazo a SQL Server 2016Vistazo a SQL Server 2016
Vistazo a SQL Server 2016
 
Semana 01.pdf
Semana 01.pdfSemana 01.pdf
Semana 01.pdf
 
Configuración del entorno
Configuración del entornoConfiguración del entorno
Configuración del entorno
 
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
Programacion de base de datos - Unidad 1: Conexion a la base de datos con un ...
 
LenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptxLenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptx
 
Portabilidad y transportabilidad
Portabilidad y transportabilidadPortabilidad y transportabilidad
Portabilidad y transportabilidad
 
Reportes En J Developer Parte 1 Y 2
Reportes En J Developer   Parte 1 Y 2Reportes En J Developer   Parte 1 Y 2
Reportes En J Developer Parte 1 Y 2
 
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
Como sacar el máximo partido a los Cores de MuleSoft - optimización y buenas ...
 
Base De Datos
Base De DatosBase De Datos
Base De Datos
 

Kürzlich hochgeladen

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Kürzlich hochgeladen (11)

Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 

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.