Mysql
 sql >> база данни >  >> RDS >> Mysql

Проследяване на времето за заявки в DB - Bookshelf/knex

Току-що написах малък тестов код как да проследя продължителността на транзакцията с 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);
}

Същият крал на подхода трябва да работи и за времето на заявка. За да предотвратите изтичане на памет в счетоводството на таймера, трябва да добавите някакъв код за почистване.

Таймерът за продължителност на заявката трябва да се стартира в query събитие и спря в query-response или query-error в зависимост кой от тях се задейства първо.

За да може да съвпадне query - query-response двойка querySpec.__knexQueryUid атрибутът може да се използва.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да разделите низ в MySQL

  2. Какво представлява MySQL еквивалентът на функцията CHOOSE() на SQL Server?

  3. Как да изберете дата от колона дата и час?

  4. Дизайн на база данни за съхраняване на цветен модел на изображението в MySQL за търсене на изображение по цвят

  5. Мигрирайте база данни от Postgres към MySQL