我正在开发一个基于express
的应用程序,它对不同的(用户不同的!)SQL Server 2008和2014数据库进行一些查询。它是不同的,因为每个用户属于不同的公司,每个公司都有自己的SQL Server。我的应用程序使用自己的SQL Server来管理公司及其SQL Server连接字符串(我的应用程序可以访问其数据库服务器)。我正在使用mssql
模块。
我没有找到关于“我应该为每个用户会话使用一个SQL Server连接还是为每个用户请求使用一个连接”的最佳做法。
来自.NET世界我们有一条规则:"one query/function - one connection"。
首先,应用程序必须查询自己的应用程序数据库,以获取用户公司数据库的SQL Server连接字符串。然后,用户可以从他们公司的SQL Server(在我的应用程序中)中检索一些数据 - 例如getAccounts()
。这些函数中的每一个(每个函数 - 不是该函数中的每个请求!)都会打开一个新连接并在查询完成后关闭它:
let connection = new mssql.Connection(conStr, (err) => {
request.query(queryString, (err, result) => {
if (err)
throw new Error('...');
resolve(result)
connection.close();
});
})
据我了解,如果100个用户为每个请求打开和关闭连接(假设每个用户同时只有一个请求),或者100个用户有100个打开的连接(每个用户一个),则不会产生(负面)差异)整个会议。乍一看似乎我的方法资源不足,因为只有在需要时才打开连接(即每个请求几秒钟)。
我错过了什么吗?如果200个用户同时访问我的应用程序怎么办?我会以某种方式遇到麻烦吗?
提前致谢!
[编辑]
据我了解,
let connection = new mssql.Connection(...)
将创建一个新的连接池,当我使用类似
的内容时打开新连接connection.connect()
并关闭所有有效连接:
connection.close()
所以我猜测我的方案中的最佳做法是为每个活动用户创建一个连接池(new mssql.Connection(..)
),将其保存在某种会话存储中,然后在会话的整个生命周期中重复使用它。
这是一个好方法吗?
我只想避免一件事:用户因为无法创建连接而收到错误。