0

我使用这个特定版本: SQL Server npm 包的https://github.com/patriksimek/node-mssql/tree/v3.3.0#multiple-connections

我一直在查看繁琐的文档(底层库)和微软的文档(参见上面的 github 链接)。

我找不到任何可以做一些简单的事情getCurrentConnection,或者getConnectionStatus类似的事情。

我有两种方法可以解决这个问题,但我对它们都不满意,所以这就是我在这里问的原因。

我的第一种方法是设置一个超时,让 connect 函数在每个catch(err).

第二个是在中间件中处理此问题,但如果一切正常,它将在每个请求上建立与 SQL 的连接并再次关闭该连接。

我的中间件功能:

api.use(function(err, req, res, next){
   sql.close();
   sql.connect(config.database).then(() => {
     next();
   }).catch(function(err) {
     sql.close();
     server.main();
   });
});

我想,如果可能的话,在服务器或数据库崩溃时选择连接而不是关闭并启动一个新连接,我仍然有一些来自现有函数的数据。

4

2 回答 2

1

在 Arnold 的帮助下,我了解了 mssql 包,它的内部工作原理要好得多。

因此,我想出了以下解决方案来解决我的问题。

let intervalFunction;
const INTERVAL_DURATION = 4000;

if (require.main === module){
    console.log("Listening on http://localhost:" + config.port + " ...");
    app.listen(config.port);
    // try to connect to db and fire main on succes. 
    intervalFunction = setInterval(()=> getConnection(), INTERVAL_DURATION);
}

function getConnection() {
  sql.close();
  sql.connect(config.database).then(() => {
    sql.close();
    clearInterval(intervalFunction);
    main();
}).catch(function(err) {
    console.error(err);
    console.log(`DB connection will be tried again in ${INTERVAL_DURATION}ms`)
    sql.close();
  });
}

建立初始连接但同时丢失后,池将自动获取连接并处理您的连接

于 2017-07-10T13:12:27.337 回答
0

如果我理解正确,您基本上想重用连接。Tedious 有内置的连接池,所以你不必担心重复使用它们:

var config = {
    user: '...',
    password: '...',
    server: 'localhost',
    database: '...',
    pool: {
        max: 10,
        min: 0,
        idleTimeoutMillis: 30000
    }
}

在上面的示例中(刚刚从您发布的 GitHub URL 复制),池中将有 10 个连接可供使用。美妙之处在于:池管理器将为您处理所有连接使用和重用,即连接数量根据您的应用程序的需求是弹性的。

正如您所提到的,数据库崩溃怎么办?这也是内置的:连接健康检查:

在内部,每个 Connection 实例都是一个单独的 TDS 连接池。创建新的请求/事务/准备语句后,将从池中获取新的 TDS 连接并为所需的操作保留。操作完成后,连接将释放回池。连接健康检查是内置的,因此一旦发现死连接,它会立即被新连接替换。

我希望这有帮助!

于 2017-07-07T17:03:40.423 回答