像 Knex 这样的关系数据库框架真的在 NodeJS 上使用异步 IO 吗?
Is relational db frameworks like Knex really use asynchronous IO on NodeJS?
我读到关系数据库管理系统 RBDMS 不适合 NodeJS 非阻塞 IO 模型。主要原因是RBDMS连接和事务是有状态的。
我使用 NodeJS、PostgreSQL 和 Knex 有一段时间了。 Knex 允许我写这样的东西:
await knex.transaction(async (trx) => {
const _id = await trx.insert(data)
.into('customer')
.returning('id');
const customer_id = parseInt(_id[0]);
await trx.insert({
'customer_id': customer_id,
'created_at' : new Date(),
'op' : 'customer_creation'
})
.update({customer_id : customer_id})
.into('customer_history');
});
您知道 Knex await
调用是否真的使用真正的非阻塞 IO 吗?还是它在幕后使用了一些技巧?
问候!
伊万
我不确定 knex 支持的所有 RBDMS,但是因为 PostGres 和 MySQL 是异步的(它们在您的节点和数据库服务器之间实现某种通信协议)因此,它需要利用 Node.js.
的异步特性
你可以很容易地检查它,使用 asCallback
而不是 Promise API。
knex
.transaction(async (trx) => {
console.log('1');
trx
.insert(data)
.into('customer')
.returning('id')
.asCallback(function (err, rows) {
rows;
});
console.log('2');
})
.asCallback(function (err, rows) {
console.log('3');
});
console.log('4');
并检查第一个 console.log
将是 4
,这意味着任务在事件循环中排队 -> 这意味着它是异步的。
我读到关系数据库管理系统 RBDMS 不适合 NodeJS 非阻塞 IO 模型。主要原因是RBDMS连接和事务是有状态的。
我使用 NodeJS、PostgreSQL 和 Knex 有一段时间了。 Knex 允许我写这样的东西:
await knex.transaction(async (trx) => {
const _id = await trx.insert(data)
.into('customer')
.returning('id');
const customer_id = parseInt(_id[0]);
await trx.insert({
'customer_id': customer_id,
'created_at' : new Date(),
'op' : 'customer_creation'
})
.update({customer_id : customer_id})
.into('customer_history');
});
您知道 Knex await
调用是否真的使用真正的非阻塞 IO 吗?还是它在幕后使用了一些技巧?
问候!
伊万
我不确定 knex 支持的所有 RBDMS,但是因为 PostGres 和 MySQL 是异步的(它们在您的节点和数据库服务器之间实现某种通信协议)因此,它需要利用 Node.js.
的异步特性你可以很容易地检查它,使用 asCallback
而不是 Promise API。
knex
.transaction(async (trx) => {
console.log('1');
trx
.insert(data)
.into('customer')
.returning('id')
.asCallback(function (err, rows) {
rows;
});
console.log('2');
})
.asCallback(function (err, rows) {
console.log('3');
});
console.log('4');
并检查第一个 console.log
将是 4
,这意味着任务在事件循环中排队 -> 这意味着它是异步的。