【问题标题】:Managing database connections in Node.js, best practices?在 Node.js 中管理数据库连接,最佳实践?
【发布时间】:2018-08-23 12:15:12
【问题描述】:

我正在构建一个 Node 应用程序,它将查询简单和更复杂(多连接)的查询。我正在寻找有关如何管理 mySQL 连接的建议。

我有以下元素:

  • server.js : 快递
  • router1.js(虚构名称):Express Router 中间件
  • router2.js(虚构名称):Express Router 中间件
//这是路由器1 router.get('/', function (req, res){ 连接.连接(函数(错误){...}); connection.query('SELECT* FROM table WHERE id = "blah"', function(err,results,fields){ 控制台.log(结果); }); ... 连接.end(); })

每次请求“/router1/”时我应该连接到 mysql,就像在这个例子中一样,还是最好在启动时打开一个连接?如:

connection.connect();
外部:
router.get('/',function(req,res){
...
});
?

【问题讨论】:

  • 我认为最好的方法不是留下打开的连接,而是使用连接池,以便可以重复使用连接。这是a link 如何连接连接。这是a good article,提供更多信息。
  • 第一次打开连接时,会根据连接字符串创建一个连接池。在我们关闭一个连接后,连接返回到池中。当我们用相同的连接字符串打开另一个连接时,池化器会查看池中是否有可用的连接。如果池连接可用,则将其返回给调用者,而不是打开新连接。建议关闭连接或在 using 块内打开连接。这样,连接将被返回到池中以供将来重用

标签: mysql node.js database


【解决方案1】:
> npm install mysql

mysql 是一个很棒的模块,它使使用 MySQL 变得非常容易,它提供了您可能需要的所有功能。

一旦你安装了mysql,你所要做的就是连接到你的数据库

var mysql = require('mysql')

var conn = mysql.createConnection({
  host: 'localhost',
  user: 'username',
  password: 'password',
  database: 'database'
})

conn.connect(function(err) {
  if (err) throw err
  console.log('connected')
})

现在您已准备好开始写入和读取数据库。

【讨论】:

    【解决方案2】:

    我为此使用 mysql2,它基本上是 mysql,但有承诺。如果你使用mysql,你也可以这样做。

    创建一个名为 connection.js 或其他东西的单独文件。

    const mysql = require('mysql2');
    
    const connection = mysql.createPool({
        host: "localhost",
        user: "",
        password: "",
        database: ""
        // here you can set connection limits and so on
    });
    
    module.exports = connection;
    

    那么你最好创建一些模型并在你的控制器中调用它们,在你的router.get('/', (req, res) => {here});

    模型如下所示:

    const connection = require('../util/connection');
    
    async function getAll() {
        const sql = "SELECT * FROM tableName";
        const [rows] = await connection.promise().query(sql);
        return rows;
    } 
    exports.getAll = getAll;
    

    你可以在有或没有承诺的情况下做到这一点,没关系。 查询完成后,您与池的连接会自动释放。 然后你应该从你的路由器或应用程序调用 getAll。

    希望对您有所帮助,如果没有,请见谅。

    【讨论】:

      【解决方案3】:

      连接池是应该怎么做的。为每个请求打开一个新连接会减慢应用程序的速度,它迟早会成为瓶颈,因为节点不会像 PHP 那样自动关闭连接。因此,连接池确保固定数量的连接始终可用,并在需要时处理关闭不必要的连接。

      这就是我使用 Sequelize 启动我的 express 应用程序的方式。对于 Mongoose,除了库 API 之外,它或多或少是相似的。

      const sequelize = new Sequelize('database', 'username', 'password', {
          host: 'localhost',
          dialect: 'mysql',
          pool: {
              max: 5,
              min: 0,
              acquire: 30000,
              idle: 10000
          }
      });
      
      sequelize.authenticate()
          .then(
              // On successfull connection, open a port
              // and listen to requests. This is where the application 
              // starts listening to requests.
              () => {
                  const server = http.createServer(app);
                  server.listen(port);
              },
          )
          .catch(err => {
              console.error('Unable to connect to the database:', err);
              console.error('Cancelling app server launch');
          });
      

      只有在建立数据库连接后才会启动应用程序。这可确保服务器在没有任何数据库连接的情况下不会处于活动状态。连接池将默认保持连接打开,并使用池外的连接进行所有查询。

      【讨论】:

        猜你喜欢
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 2016-03-06
        • 2013-07-07
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多