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

0cn*_*che 7 mysql database node.js

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

我具有以下要素:

  • server.js:快速
  • router1.js(虚拟名称):Express Router中间件
  • router2.js(虚拟名称):Express Router中间件
    //这是router1

    router.get('/',函数(req,res){

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

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

我是否应该在每次请求'/ router1 /'时都连接到mysql,如本例所示,还是最好在启动时保持一个连接打开?如:

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

Lau*_*ont 5

我为此使用 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;
Run Code Online (Sandbox Code Playgroud)

那么最好创建一些模型并从控制器内部调用这些模型 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;
Run Code Online (Sandbox Code Playgroud)

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

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


Kal*_*ran 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');
    });
Run Code Online (Sandbox Code Playgroud)

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