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

时间:2014-07-31 16:13:51

标签: 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连接的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

晚了好,从来没有。

connection.destroy()意味着你在每次展示时都会建立一个与mySQL的新连接,而不是仅仅抓住一个空闲连接并查询那些开销较少的连接。基本上你不再使用游泳池了。

您的mySQL用户可能与mysql的连接数量有限,或者您对sql的查询数量比进入服务器的展示次数要慢。

您可以尝试将connectionLimit参数调整为更高的值,以便您的服务器可以同时处理更多连接。

var pool  = mysql.createPool({
  connectionLimit : 10,
  host            : 'example.org',
  user            : 'bob',
  password        : 'secret'
});