Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Theo dõi thời gian truy vấn DB - Giá sách / quỳ

Tôi vừa viết một số mã thử nghiệm nhỏ về cách theo dõi thời lượng giao dịch bằng quỳ.

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);
}

Phương pháp tiếp cận tương tự cũng sẽ hoạt động cho thời gian truy vấn. Mặc dù vậy, để ngăn sổ kế toán hẹn giờ bị rò rỉ bộ nhớ, bạn nên thêm một số mã dọn dẹp.

Bộ hẹn giờ thời lượng truy vấn phải được bắt đầu trong query sự kiện và dừng lại trong query-response hoặc query-error tùy thuộc vào cái nào sẽ kích hoạt trước.

Để có thể đối sánh với query - query-response cặp querySpec.__knexQueryUid thuộc tính có thể được sử dụng.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để sử dụng đúng CASE..WHEN trong MySQL

  2. MySQL - Làm thế nào để chạy nhiều truy vấn cập nhật trong một dòng?

  3. tạo lớp enum từ bảng với JOOQ

  4. Chèn và đặt giá trị với sự cố max () + 1

  5. Làm cách nào để xóa khỏi nhiều bảng trong MySQL?