1

我有以下代码:

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 调用/api/test大约 5 秒,平均响应大约是 430 毫秒,这就是 Sequelize 代码。

如果我从exports.test2(和 api 调用/api/test2)间隔 5 秒运行代码,第一次调用是 430 毫秒,但之后的调用大约是 100 毫秒,那就是 Knex。

我应该提一下,如果我运行exports.test代码的时间间隔不到一秒,我会得到大约 100 毫秒的响应时间,并且exports.test2代码,我可以在两次调用之间等待 2-3 分钟,仍然可以获得 100 毫秒的响应时间。

Sequelize 是否缺少某种配置,导致它与 Knex 相比要慢得多?为什么使用 Knex 间隔几分钟的请求比使用 Sequelize 间隔几秒的请求要快得多?

4

1 回答 1

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
  }
});
于 2013-08-09T22:17:15.057 回答