En este segundo Meetup nos vamos a centrar en la integración de Mulesoft con BBDD relacionales del tipo Oracle, PostgreSQL, MySQL
1.- Cómo se integra Java con Bases de Datos relacionales
2.- Somo los integradores capaces de hacer de DBA? pide ayuda a alguien que sepa de BBDD
3.- Pool de conexiones, que es y para que nos sirve para mejorar el rendimiento
4.- ApiKit OData, generación automática de API´s a partir de una conexión de BD
5.- Historias para no dormir y casos extraños que nos encontramos en los clientes
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.
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;
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.
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
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
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
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.