Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Melacak waktu kueri DB - Rak buku/knex

Saya baru saja menulis beberapa kode tes kecil bagaimana melacak durasi transaksi dengan 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);
}

Raja pendekatan yang sama harus bekerja juga untuk waktu kueri. Untuk mencegah pembukuan pengatur waktu dari kebocoran memori, Anda harus menambahkan beberapa kode pembersihan.

Timer durasi kueri harus dimulai di query acara dan berhenti di query-response atau query-error tergantung mana yang terpicu lebih dulu.

Untuk dapat mencocokkan query - query-response pasangkan querySpec.__knexQueryUid atribut dapat digunakan.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP - Kesalahan Sementara / Lain?

  2. Bagaimana menangani pembagian dengan nol secara kondisional dengan MySQL

  3. pymssql.OperationalError:pesan kesalahan DB-Lib 20009, tingkat keparahan 9

  4. Membuat objek Tanggal ActionScript dari string stempel waktu UTC MySQL

  5. driver oledb mysql