繁体   English   中英

在 Node.js 中管理数据库连接,最佳实践?

[英]Managing database connections in Node.js, best practices?

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

我有以下要素:

  • server.js:快递
  • router1.js(虚构名称):Express Router 中间件
  • router2.js(虚构名称):Express Router 中间件

    //this is router1

    router.get('/', function (req, res){

    connection.connect(function(Err){...});

      connection.query('SELECT* FROM table WHERE id = "blah"', function(err,results,fields){
        console.log(results);
      });
      ...
    connection.end();
    })

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

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

我为此使用 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 。

我希望这有帮助,如果没有,抱歉。

连接池是应该如何完成的。 为每个请求打开一个新连接会减慢应用程序的速度,它迟早会成为瓶颈,因为节点不会像 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');
    });

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

如果您使用createPool mysql将管理打开和关闭连接,您将获得更好的性能。 mysql还是mysql2还是sequlize都没关系。 createPool使用单独的文件并将其导出。 您可以在任何地方使用它。 不要使用类,只是在功能上使用它以获得更好的 nodejs 性能。

> 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')
})

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM