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

时间:2018-12-04 01:06:35

标签: node.js azure azure-sql-database azure-functions tedious

我有一个提供node.js API的功能应用程序。我们已经很繁琐地连接到Azure SQL,达到了900个并发连接限制,并且意识到我们应该添加连接池(当然,除非有更好的建议)。

Azure Functions + Azure SQL + Node.js and connection pooling between requests?似乎在回答我们的祈祷,但想验证如何将单个连接池与Azure函数一起使用

最佳做法是放入“让池=新的ConnectionPool(poolConfig,connectionConfig);”。以上mode.exports的所有功能?难道不是每次调用单个函数都创建一个新池吗?

不幸的是,Microsoft没有针对node.js的明确文档,因此,我们将不胜感激!

1 个答案:

答案 0 :(得分:1)

要使整个Function应用程序共享一个池,我们需要将初始化部分放在共享模块中。 Christiaan Westerbeek使用wonderful solution发布了mssql,在这方面,Function应用程序和Web应用程序之间没有太大区别。

我建议使用mssql(内部使用tediousgeneric-pool而不是tedious-connection-pool,后者似乎已有两年未更新。

将连接代码放在poolConfig.js文件夹下的SharedLib中。

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,该函数应为async(v2 js函数的默认值)。

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

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

请注意,如果“功能”应用扩展了多个实例,则还将为每个实例创建新的池。