【问题标题】:What is the correct way to be using the Node.js MySQL Library?使用 Node.js MySQL 库的正确方法是什么?
【发布时间】:2018-05-23 07:58:59
【问题描述】:

目前我正在使用 Node.js 中的 MySQL 库,但是我对使用该库的正确/最有效方式有疑问。

根据 w3schools 的说法,进行单个查询的正确方法是使用这样的代码

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "yourusername",
  password: "yourpassword",
  database: "mydb"
});

con.connect(function(err) {
  if (err) throw err;
  con.query("SELECT * FROM customers", function (err, result, fields) {
    if (err) throw err;
    console.log(result);
  });
});

但是,假设我想进行多个查询,这些查询将由一个事件执行,例如我将如何处理这个问题?我应该创建一个“初始化”函数,在程序运行后立即执行吗?

var mysql = require('mysql');

var database;

//Initialise database
function setupDatabase() {
    database = mysql.createConnection({ 
        host: token.host,
        user: token.user,
        password: token.password,
        database: token.database,
        port: token.port
    });
}

//Imagine this could be called at any time after execution
function event() {
    if(database != null) {
        database.connect(function(err) {
            if (err) throw err;
            database.query("SELECT * FROM customers", function (err, result, fields) {
                if (err) throw err;
                console.log(result);
            });
        });
    }
}

我是否必须在每次查询时都连接到数据库,或者我可以将“database.connect”调用添加到我的 setupDatabase 函数中吗?

var mysql = require('mysql');

var database;

//Initialise database
function setupDatabase() {
    database = mysql.createConnection({ 
        host: token.host,
        user: token.user,
        password: token.password,
        database: token.database,
        port: token.port
    });

    if(database != null) {
        database.connect(function(err) {
            if (err) throw err;
        });
    }
}

//Imagine this could be called at any time after execution
function event() {
    if(database != null) {
        database.query("SELECT * FROM customers", function (err, result, fields) {
            if (err) throw err;
            console.log(result);
        });
    }
}

我主要担心的是每次进行查询时调用 con.connect 函数会很慢,尽管这些是异步的,但我希望尽可能使用正确/最有效的方式。请随时纠正我对最后两个代码 sn-ps 的任何错误我到目前为止只测试了第一个。

【问题讨论】:

    标签: javascript mysql node.js


    【解决方案1】:

    您必须在每个应用程序存活时间内只建立一次数据库连接(除非您有断开连接)。然后,您可以有尽可能多的查询。

    只需将数据库连接例程放在单独的文件中,然后在您的应用程序初始化步骤中要求它。

    // mysql.js
    const mysql = require('mysql');
    module.exports = mysql.createConnection({
      host: "localhost",
      user: "yourusername",
      password: "yourpassword",
      database: "mydb"
    });
    

    或者在需要数据库连接的任何地方都需要它 - 它会返回已连接的数据库对象,而无需一次又一次地重新运行该代码。

    // inex.js
    const databse = require('./mysql')
    database.query("SELECT * FROM customers")
    

    【讨论】:

    • 所以我只需要在运行时调用一次 database.connect 就可以了,直到程序结束?
    • @Hamish 是的。您连接到数据库,然后使用它发送尽可能多的查询并且它可以处理)。
    【解决方案2】:

    我创建了一个文件,其中包含一个保存池并像这样处理与数据库的连接的函数

    let _this = {};
    let POOL = null;
    
    function getPool() {
        return new Promise((resolve, reject) => {
            if(POOL != null) {
                resolve(POOL);
            } else {
                //create connection pool
                POOL = connectionPool;
                resolve(POOL);
            }
        });
    }
    
    function closePool(){
        // close pool here
    }
    
    _this.getPool = getPool;
    _this.closePool = closePool;
    
    module.exports = _this;
    

    现在您可以致电getPool() 并获得一个连接池,您可以在其中执行查询。

    【讨论】:

      猜你喜欢
      • 2015-03-01
      • 1970-01-01
      • 2012-01-19
      • 2023-03-15
      • 2023-03-10
      • 1970-01-01
      • 2018-10-03
      • 2021-08-08
      • 1970-01-01
      相关资源
      最近更新 更多