【问题标题】:Re-use prepared statements node-js mssql in a loop在循环中重用准备好的语句 node-js mssql
【发布时间】:2019-12-19 14:44:52
【问题描述】:

我正在开发一个 TS/NodeJS/MSSQL 项目,我基本上想迭代一个数组,比如说产品,运行一个选择查询来确定所述产品是否在数据库中,并且如果不插入。

本练习的目的是为 select、insert 使用准备好的语句,并能够在迭代产品的循环中重用它们。

假设我们有这样的数组:

export interface IProduct{
 name:string;
 price:number;
}

然后我们创建连接:

const mssql = require(mssql);
let connection = new mssql.ConnectionPool({
 server:[server address],
 database:[database name],
 user:[username],
 password:[password]
});

然后是准备好的查询

let insertQuery = new msssql.PreparedStatement(connection);
insertQuery.input("name",mssql.TYPES.NVarChar);
insertQuery.input("price",mssql.TYPES.Float);

然后让我们迭代 products 数组:

async iterateProducts(products:Array<IProduct>){
//first prepare the query if it's not prepared
if(!insertQuery.prepared)
  await insertQuery.prepare("INSERT INTO Products (name,price) values (@name,@price)");

products.forEach(async (p)=>{
    let insertResult = await insertQuery.execute(p);
    //do anything after insert
  });
}
//then unprepare query
await insertQuery.unprepare();

我不断收到的错误是

Can't acquire connection for the request. There is another request in progress

我对这些东西真的很陌生,所以我很有可能完全错过了一些明显的东西或以某种方式滥用它。

注意:代码是伪代码,只是描述问题。不要把它当作生产工作代码。所以如果有一个点或逗号或任何缺失或错误的东西,它可能没问题。

任何帮助将不胜感激。 谢谢!

【问题讨论】:

    标签: node.js typescript node-mssql


    【解决方案1】:

    我认为这是由于MARS 而引起的,但我强烈建议不要执行此类操作,尤其是在循环中。如果可能 - 尝试准备一个批处理并使用 SQL 和在单个事务中处理此逻辑。这会更快,并且应该确保一致的数据库状态。

    【讨论】:

    • 我不确定我是否理解您的建议。 使用 SQL 处理此逻辑 是什么意思?我考虑到了性能,这就是我尝试使用准备好的查询的原因。
    • 对不起,我不够清楚。您正在使用准备好的查询,这很棒。但是,如果您仔细观察,对于每次迭代,您都有两次顺序数据库往返,一次检查是否存在,另一次用于插入数据。将此乘以 1000,您将有 2000 个数据库请求。这肯定会很慢。我想推荐的是尝试批量处理您的请求。要么创建一个临时表或表变量,将所有要操作的产品插入其中,然后在 SQL 中进行比较。这意味着您只需一次数据库往返即可插入和比较
    • 那更清楚是的。不幸的是,它没有解决我面临的问题,特别是 node-mssql。我的意思是即使有更高效的方法来实现相同的目标,我仍然试图弄清楚如何通过 node-mssql 重用准备好的查询
    • 为了帮助讨论,我更新了代码并删除了选择/查找部分。 node-mssql 的行为相同,即使它只是插入。
    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 2022-01-23
    • 2012-04-04
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多