mysql - 使用 Node 和 MySQL/MariaDB 构建可扩展的 API

标签 mysql node.js express mariadb node-mysql

在使用依赖于 MySQL(或者在我的例子中是 MariaDB)的 Node.js 构建 API 或 Web 应用程序时,处理和管理连接的最佳实践是什么?

根据 node-mysql 的文档,似乎有两种方法可以使用:

var connection = mysql.createConnection({...});

app.get("/", function(req, res) {
   connection.query("SELECT * FROM ....", function(error, result) {
    res.json(result);
   });
});

-- 或--

var pool = mysql.createPool({...});

app.get("/", function(req, res) {
   pool.getConnection(error, connection) {
     if (error) {
       console.log("Error getting new connection from pool");
     } else {
       connection.query("SELECT * FROM ....", function(error, result) {
         connection.release();
         res.json(result);
       });
     }
   });
});

对我来说,使用第二个选项最有意义,因为它应该根据需要使用尽可能多的连接,而不是依赖单个连接。但是,我在使用具有多个路由的池时遇到了问题,即每个路由从池中获取一个新连接,执行查询,然后将其释放回池中。每次我从池中获取连接、使用它并释放它时,MySQL 中似乎仍有一个进程在等待另一个请求。最终,这些进程在 MySQL 中累积(通过运行 SHOW PROCESSLIST 可见)并且应用程序不再能够从池中检索连接。

我已采用第一种方法,因为它有效并且我的应用程序不会崩溃,但它似乎不是一个可靠的解决方案。然而,node-mariasql看起来很有希望,但我不知道这是否会比我目前使用的更好。

我的问题是:在构建几乎每个请求都严重依赖 SQL 查询的 API 或 Web 应用程序时,处理/构建 MySQL 连接的最佳方法是什么?

最佳答案

connection.release() 更改为 connection.destory() 解决了我的问题。我不确定前者应该做什么,但后者的行为符合预期并且实际上删除了连接。这意味着一旦连接被使用完毕,它就会终止 MySQL 进程并在需要时创建另一个进程。这也意味着许多查询可以同时访问 API,慢速查询不会阻止新查询。

关于mysql - 使用 Node 和 MySQL/MariaDB 构建可扩展的 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25064012/

相关文章:

mysql - 为什么这个左外连接会产生错误的结果?

mysql - 嵌套查询的问题

JavaScript 的 setInterval 和函数何时完成

javascript - Gulp sass 悄无声息地失败了

node.js - 使用 faye 通过 websockets 发送 javascript 对象

mysql - SQL:将多行转换为同一行中的列

mysql - MariaDB/MYSql 非描述性语法错误,更新重复键

mysql - 如何在 Sequelize 中实现聚类?

express - Mongoose 和 ref UUID 数组不转换

javascript - Express.js自定义模板引擎(板 block )