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.