使用依赖于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连接的最佳方法是什么?
答案 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'
});