我有一个提供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的明确文档,因此,我们将不胜感激!
答案 0 :(得分:1)
要使整个Function应用程序共享一个池,我们需要将初始化部分放在共享模块中。 Christiaan Westerbeek使用wonderful solution发布了mssql,在这方面,Function应用程序和Web应用程序之间没有太大区别。
我建议使用mssql
(内部使用tedious
和generic-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("");
...
}
请注意,如果“功能”应用扩展了多个实例,则还将为每个实例创建新的池。