我有以下代码:
var apiLogger = require(__dirname + '/../configurations/logger').api;
var Knex = require('knex');
var microtime = require('microtime');
var Sequelize = require("sequelize");
database = new Sequelize('MYDATABASE', 'MYUSERNAME', 'MYPASSWORD', {
host: "MYHOST",
port: 3306,
dialect: 'mysql',
pool: {
maxConnections: 5,
maxIdleTime: 30
}
});
Knex.Initialize({
client: 'mysql',
connection: {
host : 'MYHOST',
user : 'MYUSERNAME',
password : 'MYPASSWORD',
database : 'MYDATABASE',
charset : 'utf8'
}
});
exports.test = function(req, res){
apiLogger.info('Request made to /api/test');
var start = microtime.nowDouble();
database.query('SELECT id, username FROM Users ORDER BY RAND() LIMIT 10').then(function(data) {
console.log('query time : ' + (microtime.nowDouble() - start));
res.json(data);
}, function(data) {
res.json(data);
});
};
exports.test2 = function(req, res){
apiLogger.info('Request made to /api/test2');
var start = microtime.nowDouble();
Knex.Raw('SELECT id, username FROM Users ORDER BY RAND() LIMIT 10').then(function(data) {
console.log('query time : ' + (microtime.nowDouble() - start));
res.json(data);
}, function(data) {
res.json(data);
});
};
如果我执行exports.test
中的代码(/api/test
的api调用)彼此相距约5秒,则平均响应时间约为430毫秒,这就是Sequelize代码。
如果我从exports.test2
运行代码(和/api/test2
的api调用)相隔5秒,第一次调用是430毫秒,但之后的调用大约是100毫秒,那是Knex。
我应该提一下,如果我运行exports.test
代码相隔不到一秒钟,我得到大约100毫秒的响应时间,并且使用exports.test2
代码,我可以等待2-3分钟调用并仍然获得100ms的响应时间。
Sequelize是否缺少某种配置,导致它比Knex慢得多?为什么使用Knex将请求分开的时间比使用Sequelize的相同请求快得多?
答案 0 :(得分:2)
我将Knex中的默认连接池设置为最小值10:
https://github.com/tgriesser/knex/blob/master/clients/base.js#L22
这可能是原因。
您可以使用以下方式设置池化连接数:
Knex.Initialize({
client: 'mysql',
connection: {
host : 'MYHOST',
user : 'MYUSERNAME',
password : 'MYPASSWORD',
database : 'MYDATABASE',
charset : 'utf8'
},
pool: {
max: 5
}
});