【发布时间】:2020-10-08 00:31:23
【问题描述】:
我在我的 Node.js express 应用程序中使用 mssql 来跨许多不同的 SQL 服务器连接到许多不同的数据库。
我构建了以下示例来演示我的代码的一般结构:
app.get('/api/example'), async (request, response) => {
// FYI I may be using await incorrect here since I'm new to it, just using it here for code simplicity
let results1 = await GetDataFromSqlServerA()
let results2 = await GetDataFromSqlServerB()
response.status(200).send([results1, results2])
});
function GetDataFromSqlServerA() {
return new Promise(function(resolve, reject) {
let sql = require("mssql")
let sqlConnectionDetails = {
user: 'test',
password: 'foobar',
server: 'SQLServerA',
database: 'DatabaseA'
}
sql.connect(sqlConnectionDetails, function (error) {
let sqlRequest = new sql.Request()
let queryText = 'SELECT * FROM TableA'
sqlRequest.query(queryText, function (error, results) {
sql.close()
resolve(results)
})
})
})
}
function GetDataFromSqlServerB() {
return new Promise(function(resolve, reject) {
let sql = require("mssql")
let sqlConnectionDetails = {
user: 'test',
password: 'foobar',
server: 'SQLServerB',
database: 'DatabaseB'
}
sql.connect(sqlConnectionDetails, function (error) {
let sqlRequest = new sql.Request()
let queryText = 'SELECT * FROM TableB'
sqlRequest.query(queryText, function (error, results) {
sql.close()
resolve(results)
})
})
})
}
我有一个请求,它异步地从两个单独的 SQL 服务器位置查找数据。第一个 SQL 调用执行正常,但第二个调用失败 Invalid object 'Table2'。它找不到表,因为第二次呼叫出于某种原因获取了第一次呼叫的连接详细信息。它指向错误的 SQL 服务器和数据库!
我原以为这是不可能的,因为函数在它们自己的范围内。第一个 SQL 调用应该对第二个 SQL 调用一无所知,反之亦然 - 或者至少我会想到。
我也尝试过在全局范围内定义一个 sql 实例,但同样的问题发生了。
我可以让一个函数与服务器 A 建立 SQL 连接,向服务器 A 发出请求,与服务器 A 断开连接,与服务器 B 建立 SQL 连接,最后向服务器 B 发出请求。但是,当异步开始发挥作用,并发请求正在触发 SQL,我有问题。
希望我只是愚蠢,因为我是异步代码的新手,请赐教!谢谢!
【问题讨论】:
-
即使您向 sql.connect() 提供单独的连接字符串,我怀疑您可能与全局连接池发生冲突。你读过Advanced Pool Management 了吗?
-
谢谢@AlwaysLearning,不知何故我以前没有偶然发现这一点。我知道我在哪里有问题。请参阅以下段落“为了帮助您的应用程序中的池管理,可以使用全局 connect() 函数。从该库的 v6 开始,开发人员可以重复调用此函数以获取全局连接池。这意味着您不需要跟踪应用程序中的池(过去就是这种情况)。如果全局池已连接,它将解析为已连接的池。”。我有一些工作要做!
标签: sql node.js sql-server express concurrency