我有一个提供 Node.js API 服务的函数应用程序。我们通过繁琐的连接到 Azure SQL 达到了 900 个并发连接限制,并意识到我们应该添加连接池(当然,除非有更好的建议)。
Azure Functions + Azure SQL + Node.js and connection pooling between requests?似乎回应了我们的祈祷,但想要验证如何将单个连接池与 Azure 函数一起使用
最好的做法是放置“let pool = new ConnectionPool(poolConfig, connectionConfig);”上面的 mode.exports 是否支持所有功能?这不是每次调用单个函数时都会创建一个新池吗?
不幸的是,微软没有关于 Node.js 的明确文档,因此我们将不胜感激!
最佳答案
为了使整个Function应用程序共享一个池,我们需要将初始化部分放入共享模块中。 Christiaan Westerbeek 发布了 wonderful solution使用mssql ,在这方面,Function 应用和 Web 应用没有太大区别。
我建议使用mssql
(在内部使用tedious
和generic-pool
)而不是tedious-connection-pool好像已经两年没有更新了。
将连接代码放入 SharedLib
文件夹下的 poolConfig.js
中。
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 应用程序扩展到多个实例,则也会为每个实例创建新池。
关于node.js - 使用 Azure 函数和 Azure SQL (node.js) 达到连接限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53604240/