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

时间:2018-03-14 19:59:44

标签: mysql node.js database

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

我有以下要素:

  • server.js:Express
  • 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();
    })

我应该每次都连接到mysql' / router1 /'请求,就像在这个例子中,或者在启动时保持一个连接打开一个更好?作为:

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

3 个答案:

答案 0 :(得分:1)

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

这就是我使用Sequelize启动快速应用程序的方式。对于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');
    });

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

答案 1 :(得分:1)

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

我希望这会有所帮助,对不起。

答案 2 :(得分:0)

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

现在您可以开始从数据库中进行写入和读取了。