如果断开连接,MSSQL会选择连接

时间:2017-07-07 14:50:06

标签: sql-server node.js tedious

我会尝试尽可能清楚地解决我的问题。

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

我一直在查看繁琐(底层的lib)和microsofts文档的文档(参见上面的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();
   });
});

P.S所以要清楚我想,如果可能的话,拿起连接而不是关闭并启动一个关于服务器或数据库崩溃的时候我仍然有一些来自excisting函数的数据。

希望我足够清楚。

2 个答案:

答案 0 :(得分: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();
  });
}

初始连接完成但在此期间丢失了,游泳池将自动接收连接并处理您的连接

答案 1 :(得分:0)

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

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

在上面的示例中(仅从您发布的GitHub URL中复制),池中将有10个连接可供使用。这就是美:游泳池管理员将为您处理所有连接使用和重复使用,即根据您的应用需求,连接数量是弹性的。

正如你所提到的,DB崩溃了怎么办?这也是内置的:连接健康检查:

  

在内部,每个Connection实例都是一个单独的TDS池   连接。一旦您创建了新的请求/交易/准备   声明,从池中获取新的TDS连接并保留   为了期望的行动。一旦操作完成,连接就是   释放回游泳池。连接健康检查是内置的一次   发现了死连接,它立即被替换为   新的。

我希望这有帮助!