1
1
mirror of https://github.com/Fabio286/antares.git synced 2025-04-12 17:31:11 +02:00

perf(MySQL): improved connections pool handling

This commit is contained in:
Fabio Di Stasio 2021-05-15 21:47:30 +02:00
parent 854472c7a3
commit 434711a360
3 changed files with 72 additions and 71 deletions
README.md
src
main/libs/clients
renderer/components

@ -83,8 +83,8 @@ This is a roadmap with major features will come in near future.
#### • ARM #### • ARM
- [ ] Windows - [ ] Windows
- [ ] Linux - [x] Linux
- [ ] MacOS - [x] MacOS
## Translations ## Translations

@ -1,5 +1,5 @@
'use strict'; 'use strict';
import mysql from 'mysql2'; import mysql from 'mysql2/promise';
import { AntaresCore } from '../AntaresCore'; import { AntaresCore } from '../AntaresCore';
import dataTypes from 'common/data-types/mysql'; import dataTypes from 'common/data-types/mysql';
@ -102,8 +102,10 @@ export class MySQLClient extends AntaresCore {
* @memberof MySQLClient * @memberof MySQLClient
*/ */
async connect () { async connect () {
delete this._params.application_name;
if (!this._poolSize) if (!this._poolSize)
this._connection = mysql.createConnection(this._params); this._connection = await mysql.createConnection(this._params);
else { else {
this._connection = mysql.createPool({ this._connection = mysql.createPool({
...this._params, ...this._params,
@ -1273,6 +1275,8 @@ export class MySQLClient extends AntaresCore {
* @memberof MySQLClient * @memberof MySQLClient
*/ */
async raw (sql, args) { async raw (sql, args) {
if (process.env.NODE_ENV === 'development') this._logger(sql);// TODO: replace BLOB content with a placeholder
args = { args = {
nest: false, nest: false,
details: false, details: false,
@ -1280,15 +1284,15 @@ export class MySQLClient extends AntaresCore {
...args ...args
}; };
if (args.schema && args.schema !== 'public')
await this.use(args.schema);
const nestTables = args.nest ? '.' : false; const nestTables = args.nest ? '.' : false;
const resultsArr = []; const resultsArr = [];
let paramsArr = []; let paramsArr = [];
const queries = args.split ? sql.split(/((?:[^;'"]*(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*')[^;'"]*)+)|;/gm) : [sql]; const queries = args.split ? sql.split(/((?:[^;'"]*(?:"(?:\\.|[^"])*"|'(?:\\.|[^'])*')[^;'"]*)+)|;/gm) : [sql];
const isPool = typeof this._connection.getConnection === 'function';
const connection = isPool ? await this._connection.getConnection() : this._connection;
if (process.env.NODE_ENV === 'development') this._logger(sql);// TODO: replace BLOB content with a placeholder if (args.schema)
await connection.query(`USE \`${args.schema}\``);
for (const query of queries) { for (const query of queries) {
if (!query) continue; if (!query) continue;
@ -1297,13 +1301,10 @@ export class MySQLClient extends AntaresCore {
let keysArr = []; let keysArr = [];
const { rows, report, fields, keys, duration } = await new Promise((resolve, reject) => { const { rows, report, fields, keys, duration } = await new Promise((resolve, reject) => {
this._connection.query({ sql: query, nestTables }, async (err, response, fields) => { connection.query({ sql: query, nestTables }).then(async ([response, fields]) => {
timeStop = new Date(); timeStop = new Date();
const queryResult = response; const queryResult = response;
if (err)
reject(err);
else {
let remappedFields = fields let remappedFields = fields
? fields.map(field => { ? fields.map(field => {
if (!field || Array.isArray(field)) if (!field || Array.isArray(field))
@ -1371,13 +1372,14 @@ export class MySQLClient extends AntaresCore {
fields: remappedFields, fields: remappedFields,
keys: keysArr keys: keysArr
}); });
} }).catch(reject);
});
}); });
resultsArr.push({ rows, report, fields, keys, duration }); resultsArr.push({ rows, report, fields, keys, duration });
} }
if (isPool) connection.release();
return resultsArr.length === 1 ? resultsArr[0] : resultsArr; return resultsArr.length === 1 ? resultsArr[0] : resultsArr;
} }
} }

@ -368,7 +368,6 @@ export default {
}, },
setNull () { setNull () {
const row = this.localResults.find(row => this.selectedRows.includes(row._id)); const row = this.localResults.find(row => this.selectedRows.includes(row._id));
delete row._id;
const params = { const params = {
primary: this.primaryField.name, primary: this.primaryField.name,