Implementar accés a la BD MySQL per guardar-hi els clients, contenidors i registres de crides
Per aquesta implementació s'ha de fer el següent:
[x] Crear un servei d'accés a la BD de manera que obri un pool de connexions quan s'inicia l'aplicació
[x] El servei d'accés ha de gestionar les caigudes de la BD i ser capaç de reconnectar
[x] Modificar l'api/v1/clientService per treballar contra BD
[x] Modificar l'api/v1/containerService per treballar contra BD
[x] Modificar l'api/v1/registerService per treballar contra BD
Per implementar la connexió amb MySql es consideren aquests mòduls per Nodejs i Expressjs:
mysqljs/mysql: This is a node.js driver for mysql. It is written in JavaScript, does not require compiling, and is 100% MIT licensed.
mysql2: A fast node.js MySQL library with focus on performance. Supports prepared statements, non-utf8 encodings, binary log protocol, compression, ssl and much more.
knex.js: A batteries-included, multi-dialect (PostgreSQL, MySQL, CockroachDB, MSSQL, SQLite3, Oracle (including Oracle Wallet Authentication)) query builder for Node.js
Per implementar-ho es tria fer servir mysql2 pels següents motius:
Prioritzem rendiment sobre compatibilitat, per tant descartem les ORM i query builders ja que afegixen capes i lentitut
Dels dos drivers MySql triem mysql2 ja que ofereix un rendiment superior i conté els elements bàsics per treballar amb MySql (pool de connexions i transaccions).
Per tal de treballar de forma concurrent i sense bloqueigs a partir de múltiples serveis contra la mateixa base de dades, per agafar registres i fer-hi operacions de modificació o esborrat es pot fer de diferents maneres (no fer res i el que actualitza l'últim guanya, concurrència optimista en que es suposa que hi haurà pocs conflictes i l'usuari afectat no li farà res tornar-ho a intentar), concurrència pessimista on es suposen molts conflictes i que els usuaris afectats no voldran reintantar-ho).
- SELECT iD, val1, val2, version
FROM theTable
WHERE iD = @theId;
- {code that calculates new values}
- BEGIN TRANSACTION;
- UPDATE theTable
SET val1 = @newVal1,
val2 = @newVal2,
version = version + 1
WHERE iD = @theId
AND version = @oldversion;
- {if AffectedRows == 1 }
- COMMIT TRANSACTION;
- {go on with your other code}
- {else}
- ROLLBACK TRANSACTION;
- {decide what to do since it has gone bad... in your code}
- {endif}
Implementar accés a la BD MySQL per guardar-hi els clients, contenidors i registres de crides
Per aquesta implementació s'ha de fer el següent:
Per implementar la connexió amb MySql es consideren aquests mòduls per Nodejs i Expressjs:
Per implementar-ho es tria fer servir mysql2 pels següents motius:
Per tal de treballar de forma concurrent i sense bloqueigs a partir de múltiples serveis contra la mateixa base de dades, per agafar registres i fer-hi operacions de modificació o esborrat es pot fer de diferents maneres (no fer res i el que actualitza l'últim guanya, concurrència optimista en que es suposa que hi haurà pocs conflictes i l'usuari afectat no li farà res tornar-ho a intentar), concurrència pessimista on es suposen molts conflictes i que els usuaris afectats no voldran reintantar-ho).
Nosaltres farem servir concurrència optimista amb versionat, això vol dir: