【发布时间】:2019-12-09 21:01:22
【问题描述】:
我想通过 knex 向 SQL Server 插入大量数据。我已经降低了一次插入的数量和插入的并发性,但最终还是会导致 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);
}
}
【问题讨论】:
-
我对 knex 一无所知,但您是否尝试过调用存储过程而不是直接数据库插入?
-
不,我没有尝试过。我会调查一下谢谢
标签: node.js sql-server knex.js