用Node和MySQL / MariaDB构build一个可伸缩的API

在使用依赖于MySQL的Node.js构buildAPI或Web应用程序时(或者在我的情况下是MariaDB),什么被认为是处理和pipe理连接的最佳实践?

根据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中build立(通过运行SHOW PROCESSLIST可见),应用程序不再能够从池中检索连接。

我已经诉诸于使用第一种方法,因为它的工作原理和我的应用程序不会崩溃,但它似乎不是一个强大的解决scheme。 但是, node-mariasql看起来很有希望,但是我不知道这是否会比我目前使用的更好。

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

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

晚得再好,永远不会。

connection.destroy()意味着在每次印象中,你正在与mySQLbuild立一个新的连接,而不是仅仅获取一个空闲的连接,并查询那个开销较小的连接。 基本上你不再使用游泳池了。

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

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

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