【问题标题】:Use single database connection in entire application?在整个应用程序中使用单个数据库连接?
【发布时间】:2019-03-06 04:21:42
【问题描述】:

我正在创建一个应用程序,它将通过节点 js 中的 Udp 协议进行通信。我也使用 sql server 作为数据库,所以为了连接这个数据库,我使用mssql npm liabrary。基本上我在做什么我有一个单独的 dbcon 模块,如下所示

const sql = require('mssql')
const config = {
    user: 'sa',
    password: '123',
    server: '192.168.1.164', // You can use 'localhost\\instance' to connect to named instance
    database: 'SBM-EMCURE',

    options: {
        encrypt: false // Use this if you're on Windows Azure
    }
}
 sql.connect(config, err => {

 })

sql.on('error', err => {
    console.log('error on sql.on()');
})
module.exports.sql = sql;

我正在使用这个导出的 sql 对象在 dbcon 模块之外运行我的查询,但它有时会给我不同的行为,例如在数据库连接之前执行查询,有没有办法为整个应用程序使用单个数据库连接?使用单个数据库连接很有用,否则会减慢我的进程
提前致谢

【问题讨论】:

  • 是的,但是当我尝试重新连接数据库时,我正在使用 mssql,它会发出警告,例如请关闭以前的连接然后创建新的连接,所以我所做的我连接到数据库一次并存储其实例一个变量。我在整个应用程序中使用这个变量,它就像魅力一样工作
  • 是的,因为您使用的是与 mysql 数据库的单一连接,所以 util 更改已提交,您的 sql 连接无法使用。即使您使用一个连接来检索在高频数据检索时会失败的数据。让我给你一个董事会答案。现在请关注question
  • 还有这个article
  • 我使用的是 mssql 而不是 mysql 这个池概念是否支持 mssql 我不太了解它
  • 这里是如何使用mssql connection pool。抱歉我没看到

标签: node.js sql-server npm


【解决方案1】:

你可以:

  • 将实例传递到每个路由器,并在您设置它们时在那里使用它
  • 将实例设置为 app 对象的属性,并在中间件函数中从 req.app.sqlres.app.sql 访问它
  • 将实例设置为全局对象的属性并从任何地方访问它(但通常不是最佳做法)

另外,在您的示例代码中,您通过调用sql.connect() 来启动连接,但您没有在连接完成时给它一个回调。这导致它立即被导出,并且可能在实际建立连接之前被查询。这样做:

const util = require('util');
const sql = require('mssql');

const config = {
    user: 'sa',
    password: '123',
    server: '192.168.1.164', 
    database: 'SBM-EMCURE',

    options: {
        encrypt: false 
    }
};

module.exports = util.promisify(sql.connect)(config);

然后您可以使用以下方法检索实例:

const sql = await require('./database.js');

【讨论】:

    【解决方案2】:

    首先你应该创建文件database.js:

    var mysql = require('mysql');
    var connection = mysql.createConnection({
        host     : '127.0.0.1',
        user     : 'root',
        password : '',
        database : 'event'
    });
    
    connection.connect(function(err) {
        if (err) throw err;
    });
    
    module.exports = connection;
    

    然后您可以在server.js 或任何其他文件中使用此连接。

    var express = require('express');
    var app = express();
    var dbcon = require('./database');
    
    app.get('/getEvent',function(req,res){
        dbcon.query('SELECT * FROM eventinfo',function(err, result) {
          if (err) throw err;
        });
    });
    
    app.listen(3000);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多