sql >> Database >  >> RDS >> Mysql

Tijd voor het opvragen van DB - Bookshelf/knex

Ik heb zojuist een kleine testcode geschreven om de transactieduur te traceren met 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);
}

Dezelfde koning van aanpak zou ook moeten werken voor querytiming. Om te voorkomen dat de timerboekhouding geheugen lekt, moet je wel wat opschooncode toevoegen.

De timer voor de duur van de zoekopdracht moet worden gestart in query gebeurtenis en gestopt in query-response of query-error afhankelijk van welke als eerste wordt geactiveerd.

Om te kunnen matchen met query - query-response paar querySpec.__knexQueryUid attribuut kan worden gebruikt.




  1. PHP - CSV-bestand importeren in mysql-database met behulp van LOAD DATA INFILE

  2. Adviserende sloten of NOWAIT om wachten op vergrendelde rijen te voorkomen?

  3. SQL waarbij de samengevoegde set alle waarden moet bevatten, maar mag meer bevatten

  4. Hoe de gebruikersnaam en het wachtwoord voor de mysql-database te achterhalen?