Artículo
· 20 feb, 2023 Lectura de 4 min

Conexión a base de datos MySQL mediante JDBC desde un Business Service

Estimados miembros de la Comunidad.

Una problemática muy común en muchos usuario es el uso de una base de datos externa como entrada de datos a una producción de IRIS. Como ya sabréis tenemos dos métodos de conexión directas a bases de datos externas desde IRIS, la primera es mediante ODBC y la segunda es recurriendo a una conexión vía JDBC.

En nuestro ejemplo procederemos a realizar una conexión mediante JDBC y para ello montaremos un pequeño proyecto en Docker para que podáis jugar con ello cuanto queráis.

Tenéis el código disponible en esta url: https://github.com/intersystems-ib/workshop-sql-jgw

En nuestro docker-compose.yml configuraremos las imágenes que vamos a necesitar:

version: "2.2"
services:  
  # mysql
  mysql:
    build:
      context: mysql
    container_name: mysql
    restart: always
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: SYS
      MYSQL_USER: testuser
      MYSQL_PASSWORD: testpassword
    volumes:
    - ./mysql/sql/dump.sql:/docker-entrypoint-initdb.d/dump.sql
  
  adminer:
    container_name: adminer
    image: adminer
    restart: always
    depends_on:
      - mysql
    ports:
      - 8080:8080
  # java gateway
  jgw:
    build:
      context: java
      dockerfile: Dockerfile
    depends_on:
      - mysql
    container_name: jgw
    restart: always
    ports: 
      - 44444:44444
    environment:
      - PORT=44444
  # iris
  iris:
    init: true
    container_name: iris
    build:
      context: .
      dockerfile: iris/Dockerfile
    depends_on:
      - 'jgw'
    ports:
      - 52773:52773
      - 51773:51773
    command: --check-caps false
  • MySQL: nuestro motor de base de datos. 
  • Adminer: aplicación web que nos permitirá administrar nuestra instancia de MySQL.
  • IRIS: con la versión community más reciente  de IRIS.
  • JGW: el Java Gateway que nos permitirá conectarnos vía JDBC a nuestra base de datos.

Para desplegar los contenedores deberemos ejecutar los siguientes comandos:

docker-compose build
...
docker-compose up -d
...
docker-compose start

Una vez arrancados los contenedores podréis acceder al administrador de base de datos en la siguiente url con las siguientes valores:

  • Motor de base de datos: MySQL
  • Servidor: mysql
  • Usuario: root
  • Contraseña: SYS

Podréis ver que se encuentra configurada una base de datos llamada test dentro de la cual hay una tabla llamada patient con dos registros. Será sobre esa tabla sobre la que lanzaremos la consulta desde el Business Service.

Finalmente, accediendo al portal de gestión de la instancia de IRIS, podremos revisar la producción en el Namespace USER que se carga por defecto, Test.Production:

Analizaremos los diferentes elementos que la componen:

  • EnsLib.JavaGateway.Service: este business service será el responsable de permitir la conectividad vía JDBC a nuestra base de datos, para este ejemplo ha sido necesario desplegar un container (JGW) en el que ubicaremos nuestro JDK y que se encontrará escuchando en el puerto 44444. Si queréis configurarlo en un IRIS instalado en Windows o Linux sólo necesitaréis añadir el business services, definir la ruta al JAVA HOME y la ubicación de la librería de java que nos permitan la conexión a la base de datos, el puerto por defecto en ese caso será el 55555.
  • EnsLib.SQL.Service.GenericService: mediante este servicio deberemos configurar una serie de opciones.
    • DSN: url de conexión a nuestra base de datos (jdbc:mysql://mysql:3306/test). 
    • Credentials: las credenciales necesarias para la conexión (root/SYS).
    • Target config names: a donde vamos a enviar el objeto obtenido tras la lectura de la base de datos.
    • Query: consulta que vamos a lanzar periódicamente a nuestra base de datos para obtener los últimos registros añadidos.
    • Message Class: objeto que se creará con los datos obtenidos a partir de la consulta (sus propiedades deben coincidir con el nombre utilizado en los campos de la consulta).
    • Java Gateway Service: el nombre en nuestra producción del JavaGateway service.
    • JDBC Driver: el nombre del driver de conexión a nuestra base de datos (en nuestro caso será el de MySQL, com.mysql.jdbc.Driver).
  • Test.PatientToString: business process de ejemplo en el que se capturan los datos del objeto definido en el Message Class anterior y se envían a un business operation.
  • EnsLib.File.PassthroughOperation: business operation estándar que nos escribirá el resultado en un fichero de salida.

 

Si vemos en más detalle el objeto que generaremos por cada nuevo registro en la base de datos podremos comprobar que sus propiedades coinciden con las usadas en la consulta:

Class Test.Patient Extends (%Persistent, %JSON.Adaptor, %XML.Adaptor, Ens.Request)
{

Property Id As %Integer;
Property Name As %String;
Property Lastname As %String;
}

Este objeto nos permitirá mapear automáticamente nuestra query a un objeto, sin necesidad de realizar ninguna transformación farragosa.

¡Si tenéis cualquier pregunta o sugerencia no dudéis en añadir un comentario!

Comentarios (0)1
Inicie sesión o regístrese para continuar