2012-11-26 47 views
7

Benim node.js Kod Neden MySQL Node.js içinde bu kadar yavaş?

altında Kod1 gibidir:

var http=require('http'); 
var MySQL = require('mysql'); 

mysql = MySQL.createConnection(...) 

http.createServer(function(req, res){ 
    // the query will take several seconds 
    mysql.query("SELECT SLEEP(1)", function....) 
}); 
http.listen(...); 

altında Sorun çok hızlı sayfayı yenileyin sunucu çökmesi olacaktır. Node-mysql modülünün problemi olduğunu düşünüyorum, sorguyu bir kuyrukta işliyorum. Bir bağlantı havuzu oluşturmaya çalışıyorum.

code2: hala burada

.... 
var pool = require('generic-pool'); 
var mp = pool.Pool({ 
    ... 
    create: function(cb){ 
     client = MySQL.createConnection(...); 
     cb(null, client) 
    }, 
    max: 10, // up to 10 connection 
    min: 2, 
    ... 
}); 
.... 
    mp.acquire(function(err, mysql){ 

     // the query will take several seconds 
     mysql.query("SELECT SLEEP(1)", function....) 
     mp.release(mysql); 
    }); 
.... 

Ama sorunun altında, Neden? Bunu nasıl düzeltebilirim?

DÜZENLEME: 100 eşzamanlı, 10 saniye beklenen 100 istek başlatıyorum. Ama 20 saniye sürüyor. Niye ya? Havuz sadece 5'e kadar bağlantıyı destekliyor mu?

+0

Sorgu nedir? Uygun dizinler tarafından destekleniyor mu? –

+0

Bu konuda yardım almak için sözde koddan daha fazla posta göndermeniz gerekecek. – JohnnyHK

+0

Düğüm aracılığıyla değil, komut satırında çalıştırdığınızda sorgu ne kadar sürer? –

cevap

1

Bağlantı havuzları, birden çok eşzamanlı isteği işlemek için iyi bir çözümdür. Ancak, 'Genel kaynak havuzu' kullanmak yerine, neden bir mysql-spesifik havuzu kullanamıyoruz?

node.js

+0

Bağlantı havuzu oluşturmak için 'node-mysql'' createPool ({}) 'işlevini kullanarak daha iyi olabilir –

1

Reddi için MySQL bağlantı havuzu 'düğüm mysql-havuz', yaklaşık Bu link görüşmeler: Ben bu tür sorunların çözümü için modül yazdım. Bağlantı havuzunuzu yapılandırabilirsiniz. ( ) En fazla 100 bağlantı kullanıyorum.

var Pool = require('mysql-simple-pool'); 
var pool = new Pool(100, { 
    host: 'localhost', 
    user: 'root', 
    password: 'root', 
    database: 'test' 
}); 

Şimdi bunu sınamaya çıkaracak bir sınama işlevi yazabilirsiniz.

function test() { 
    var counter = 0; 
    var start = new Date().getTime(); 
    for (var xa = 0; xa < 10; xa++) { 
     pool.query('SELECT SLEEP(1)', function(err, results) { 
      counter++; 
      if (counter == 10) { 
       var end = new Date().getTime(); 
       console.log('Time spend is ' + (end - start) + 'ms'); 
       test(); 
      } 
     }); 
    } 
} 
test(); 

Ve bu çıkış olduğunu ...

Time spend is 1044ms 
Time spend is 1006ms 
Time spend is 1005ms 
Time spend is 1006ms 
Time spend is 1007ms 
Time spend is 1005ms 
Time spend is 1005ms 
Time spend is 1004ms 
Time spend is 1005ms 
Time spend is 1005ms 

etrafında ilk kez bağlantılarının kurulması biraz zaman harcıyor. Umarım bu yardımcı olur ~

İlgili konular