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);
  });
};

互いに約 5 秒間隔でコードexports.test(の API 呼び出し/api/test) を実行すると、平均応答は約 430 ミリ秒で、これが Sequelize コードです。

からのコードexports.test2(および の api 呼び出し/api/test2) を 5 秒間隔で実行すると、最初の呼び出しは 430 ミリ秒ですが、その後の呼び出しは約 100 ミリ秒で、それが Knex です。

exports.testコードを互いに 1 秒未満の間隔で実行すると、約 100 ミリ秒の応答時間が得られ、exports.test2コードを使用すると、呼び出しの間に 2 ~ 3 分待っても 100 ミリ秒の応答時間を得ることができます。

Knex と比較して Sequelize が大幅に遅くなる原因となっている、Sequelize に欠けている何らかの構成はありますか? 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 に答える