sql >> Database teknologi >  >> RDS >> Mysql

Sporing af DB-forespørgselstid - Bogreol/knex

Jeg har lige skrevet en lille testkode, hvordan man sporer transaktionsvarighed med knex.

https://runkit.com/embed/679qu91ylu4w

/**
 * Calculate transaction durations in knex
 * 
 */
require('sqlite3');
var knex = require("knex")({
  client: 'sqlite', 
  connection: ':memory:', 
  pool: { min: 1, max: 10 }
});

function isTransactionStart(querySpec) {
  return querySpec.sql === 'BEGIN;';
}

function isTransactionEnd(querySpec) {
  return querySpec.sql === 'COMMIT;' || querySpec.sql === 'ROLLBACK;';
}

const transactionDurations = {};

knex.on('query', querySpec => {
  console.log('On query', querySpec);

  if (isTransactionStart(querySpec)) {
    if (transactionDurations[querySpec.__knexUid]) {
      console.error('New transaction started, before earlier was ended');
      return;
    }
    transactionDurations[querySpec.__knexUid] = new Date().getTime();
  }

  if (isTransactionEnd(querySpec)) {
    const startTime = transactionDurations[querySpec.__knexUid];
    if (!startTime) {
      console.error('Transaction end detected, but start time not found');
    }
    const endTime = new Date().getTime();
    transactionDurations[querySpec.__knexUid] = null;
    console.log('TRANSACTION DURATION', endTime - startTime);
  }
}); 

// just as an example of other available events to show when they are called
knex.on('query-response', (res, querySpec) => {
  // console.log('On query response', res, querySpec);
}); 

knex.on('query-error', (err, querySpec) => {
  // console.log('On query error', err, querySpec);
}); 

try {
    a = await Promise.all([
      knex.transaction(trx => {
        return trx.raw('select 1');
      }),
      knex.transaction(trx => {
        return trx.raw('select 2');
      }),
      knex.transaction(trx => {
        return trx.raw('error me');
      })
    ]);
} catch (e) {
  console.log('Got ERROR:', e);
}

Den samme tilgangskonge bør også fungere for forespørgselstiming. For at forhindre timerbogføring i at lække hukommelse, bør du dog tilføje noget oprydningskode.

Forespørgselsvarighedstimeren skal startes i query hændelse og stoppet i query-response eller query-error afhængig af hvilken der udløses først.

For at kunne matche query - query-response par querySpec.__knexQueryUid attribut kan bruges.




  1. Hvordan kan jeg oprette forbindelse til MySQL i Python 3 på Windows?

  2. Hurtigt at finde forskellige værdier

  3. MYSQL PHP Advarsel:mysql_query() forventer, at parameter 1 er streng

  4. Hvordan bruger man strftime og datetime korrekt ved hjælp af Room library?