使用 knex 插入数据时使用率高 CPU (300%)
High CPU usage (300%) when inserting data with knex
我想通过 knex 向 SQL 服务器插入大量数据。我已经降低了一次插入的数量和插入的并发性,但我仍然以 CPU 高使用率告终。 knex 是否可以为每个插入启动一个连接?任何输入将不胜感激谢谢。
这是我用来连接数据库的代码。
client: "mssql",
connection: {
server: productionDbIp,
user: productionDbUsername,
password: productionDbPassword,
database: productionDbName,
options: {
port: productionDbPort
},
pool: { min: 0, max: 7 }
}
这是用于查询插入的代码
const insertQue = new PQueue({ concurrency: 1 });
// format inserts returns an array of objects that are ready to be inserted
const [inserts] = await formatInserts(distinctData);
const insertPromises = [];
while (inserts.length > 0) {
const insert = inserts.splice(0,10);
try {
insertPromises.push(
insertQue.add(() => insertToDb(insert, 'tableName'))
);
} catch (error) {
console.log(error);
}
}
try {
await Promise.all(insertPromises);
} catch (error) {
console.log(error);
}
}
async function insertToDb(data, table, numTry = 0) {
try {
return await knex(table).insert(data);
} catch (error) {
if (numTry > 3) {
console.log(error);
throw { message: `Error inserting data`, data };
}
return insertToDb(data, numTry + 1);
}
}
快速 Google 搜索显示此答案 https://apple.stackexchange.com/q/240204
所以拥有 300% 可能甚至不是问题。您的虚拟核心正准备完成他们的工作。由于您使用的是异步调用,因此多个 proc 可以一起工作。
我想通过 knex 向 SQL 服务器插入大量数据。我已经降低了一次插入的数量和插入的并发性,但我仍然以 CPU 高使用率告终。 knex 是否可以为每个插入启动一个连接?任何输入将不胜感激谢谢。 这是我用来连接数据库的代码。
client: "mssql",
connection: {
server: productionDbIp,
user: productionDbUsername,
password: productionDbPassword,
database: productionDbName,
options: {
port: productionDbPort
},
pool: { min: 0, max: 7 }
}
这是用于查询插入的代码
const insertQue = new PQueue({ concurrency: 1 });
// format inserts returns an array of objects that are ready to be inserted
const [inserts] = await formatInserts(distinctData);
const insertPromises = [];
while (inserts.length > 0) {
const insert = inserts.splice(0,10);
try {
insertPromises.push(
insertQue.add(() => insertToDb(insert, 'tableName'))
);
} catch (error) {
console.log(error);
}
}
try {
await Promise.all(insertPromises);
} catch (error) {
console.log(error);
}
}
async function insertToDb(data, table, numTry = 0) {
try {
return await knex(table).insert(data);
} catch (error) {
if (numTry > 3) {
console.log(error);
throw { message: `Error inserting data`, data };
}
return insertToDb(data, numTry + 1);
}
}
快速 Google 搜索显示此答案 https://apple.stackexchange.com/q/240204
所以拥有 300% 可能甚至不是问题。您的虚拟核心正准备完成他们的工作。由于您使用的是异步调用,因此多个 proc 可以一起工作。