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

Posted

技术标签:

【中文标题】在 Node.js 中管理数据库连接,最佳实践?【英文标题】:Managing database connections in Node.js, best practices? 【发布时间】: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 块内打开连接。这样,连接将被返回到池中以供将来重用 【参考方案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');
    );

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

【讨论】:

以上是关于在 Node.js 中管理数据库连接,最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQLite3 + Node.js 的最佳实践

这个开源项目,给你一个《Node.js 最佳实践》

这本免费的在线书籍,给你一个《Node.js 最佳实践》

与 mongoose/node.js 共享数据库连接参数的最佳方式

与 mongoose/node.js 共享数据库连接参数的最佳方式

使用 express.js 在 node.js 中提供 html 的最佳实践是啥?