使用Javascript使用Azure函数重用数据库连接

使用Javascript使用Azure函数重用数据库连接,javascript,mongodb,mongoose,azure-functions,Javascript,Mongodb,Mongoose,Azure Functions,我无法从用Javascript编写的Azure函数中找到关于如何管理数据库连接(在我的例子中是MongoDB)的清晰信息 下面的Microsoft文档说,使用.NET Framework Data Provider for SQL Server,不要在C#中使用静态变量为每次函数调用创建连接,池由客户端连接处理。它没有描述如何在Javascript中实现这一点 这里描述了创建一个全局变量以在调用之间保存数据库客户机的解决方案,但作者不相信这是正确的方法 有没有人在生产中使用过这种方法,或者了

我无法从用Javascript编写的Azure函数中找到关于如何管理数据库连接(在我的例子中是MongoDB)的清晰信息

下面的Microsoft文档说,使用.NET Framework Data Provider for SQL Server,不要在C#中使用静态变量为每次函数调用创建连接,池由客户端连接处理。它没有描述如何在Javascript中实现这一点

这里描述了创建一个全局变量以在调用之间保存数据库客户机的解决方案,但作者不相信这是正确的方法


有没有人在生产中使用过这种方法,或者了解这种方法是否正确

是的,C#/SQL在静态变量中存储单个SqlConnection实例与JS/MongoDB在全局变量中存储单个Db实例之间有着非常相似的等价性。Azure函数中JS/MongoDB的基本模式是(假设您是最新的async/await,或者您可以根据链接文章使用回调):


这意味着每个主机实例只实例化一个Db对象。请注意,这不是每个功能一个应用程序-如果您使用的是专用应用程序服务计划,则会有您在计划中指定的实例数,如果您使用的是消费计划,则会根据您的应用程序的繁忙程度而有所不同。

是,在静态变量中存储单个SqlConnection实例的C#/SQL和全局变量中存储单个Db实例的JS/MongoDB之间有着非常相似的等价性。Azure函数中JS/MongoDB的基本模式是(假设您是最新的async/await,或者您可以根据链接文章使用回调):


这意味着每个主机实例只实例化一个Db对象。注意,这不是每个功能一个应用程序-如果您使用的是专用的应用程序服务计划,则会有您在计划中指定的实例数,如果您使用的是消费计划,那么它将根据您的应用程序的繁忙程度而有所不同。

请参阅此处的MongoClient连接池部分,并在Azure功能中使用类似的模式。请参阅此处的MongoClient连接池部分,并在Azure函数中使用类似的模式。这个答案是救命稻草。我不知道全局变量会在整个主机实例中传递,我认为在执行之后,连接会随着任何变量一起消失。因为它应该是一个无状态函数,所以@MarkXA给你的问题是-在某个连接中断之前,同时使用这个连接的最大并发函数是什么?客户端本身不应该实际中断-如果连接池已满,它将等待。更一般地说,它将取决于您的实际数据库。如果它是固定规模的,那么是的,如果Azure功能太忙,它可能会成为瓶颈。如果设置为自动缩放(例如,使用MongoDB API的Cosmos DB),那么问题就不会那么严重了。谢谢你的澄清。这个答案是一个救命稻草。我不知道全局变量会在整个主机实例中传递,我认为在执行之后,连接会随着任何变量一起消失。因为它应该是一个无状态函数,所以@MarkXA给你的问题是-在某个连接中断之前,同时使用这个连接的最大并发函数是什么?客户端本身不应该实际中断-如果连接池已满,它将等待。更一般地说,它将取决于您的实际数据库。如果它是固定规模的,那么是的,如果Azure功能太忙,它可能会成为瓶颈。如果设置为自动缩放(例如,使用MongoDB API的Cosmos DB),那么问题就不会那么严重了。谢谢你的澄清。非常感谢
// getDb.js

let dbInstance;

module.exports = async function() {
    if (!dbInstance) {
        dbInstance = await MongoClient.connect(uri);
    }
    return dbInstance;
};

// function.js

const getDb = require('./getDb.js');

module.exports = async function(context, trigger) {
    let db = await getDb();
    // ... do stuff with db ..
};