Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Śledzenie czasu zapytań do bazy danych - Regał/knex

Właśnie napisałem mały kod testowy, jak śledzić czas trwania transakcji za pomocą 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);
}

To samo podejście powinno działać również w przypadku synchronizacji zapytań. Aby zapobiec wyciekom pamięci z księgowania liczników, należy jednak dodać trochę kodu czyszczącego.

Licznik czasu trwania zapytania powinien być uruchamiany w query zdarzenie i zatrzymane w query-response lub query-error w zależności od tego, który z nich zostanie uruchomiony jako pierwszy.

Aby móc dopasować query - query-response pair querySpec.__knexQueryUid można użyć atrybutu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wstawić dane json do tabeli?

  2. Zapytanie SQL zwraca dane z wielu tabel

  3. Czytaj ogromne pliki tekstowe i przechowuj każdą linię w bazie danych

  4. Jak włączyć SSL/TLS dla MySQL w Ubuntu?

  5. mysql_num_rows() oczekuje, że parametr 1 będzie zasobem, podana wartość logiczna