使用 Azure 函数和 Azure 达到连接限制 SQL (node.js)

Hitting connection limits with Azure functions and Azure SQL (node.js)

我有一个为 node.js API 提供服务的函数应用程序。我们通过 Tedious connected to Azure SQL 达到了 900 个并发连接的限制,并意识到我们应该添加连接池(当然除非有更好的建议)。

似乎回应了我们的祈祷,但想要验证如何将单个连接池与 Azure 函数一起使用

最好的做法是将 "let pool = new ConnectionPool(poolConfig, connectionConfig);" 放在所有函数的 mode.exports 之上吗?那不是每次调用单个函数时都创建一个新池吗?

不幸的是,Microsoft 没有关于此的明确文档 node.js,因此非常感谢任何帮助!

为了让整个Function app共享一个pool,我们需要把初始化部分放到一个shared module中。 Christiaan Westerbeek 发布了一个 using mssql,在这方面函数应用程序和网络应用程序之间没有太大区别。

我建议使用 mssql(在内部使用 tediousgeneric-pool)而不是 tedious-connection-pool,后者似乎已经 2 年没有更新了。

将连接代码放在 poolConfig.jsSharedLib 文件夹下。

const sql = require('mssql');
const config = {
    pool:{
        max:50 // default: 10
    },
    user: '',
    password: '',
    server: '', 
    database: '',
    options: {
        encrypt: true // For Azure Sql 
    }
};
const poolPromise = new sql.ConnectionPool(config).connect().then(pool => {
    console.log('Connected to MSSQL');
    return pool;
  })
  .catch(err => console.log('Database Connection Failed! Bad Config: ', err));

module.exports = {
  sql, poolPromise
}

并加载模块以连接到 sql。我们使用 await 来获取 ConnectionPool 函数应该是异步的(v2 js 函数的默认值)。

const { poolPromise } = require('../SharedLib/poolConfig');

module.exports = async function (context, req) {
    var pool = await poolPromise;
    var result =  await pool.request().query("");
    ...
}

请注意,如果使用多个实例横向扩展 Function app,也会为每个实例创建新池。