2012-11-26 36 views
7

My Node.js Mã là như dưới đâyTại sao MySQL trong Node.js quá chậm?

CODE1: dưới

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(...); 

Vấn đề là máy chủ sẽ sụp đổ khi tôi làm mới trang quá nhanh. Tôi nghĩ là vấn đề của mô-đun nút-mysql, nó xử lý truy vấn trong một hàng đợi. Tôi cố gắng tạo một hồ bơi kết nối.

code2: dưới

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

Nhưng vấn đề vẫn ở đây, tại sao? Làm thế nào tôi có thể sửa lỗi này.

EDIT: Tôi khởi chạy 100 yêu cầu với 100 đồng thời, dự kiến ​​10 giây. Nhưng phải mất 20 giây. Tại sao? Hồ bơi chỉ hỗ trợ tối đa 5 kết nối?

+0

Truy vấn là gì? Nó có được hỗ trợ bởi các chỉ mục thích hợp không? –

+0

Bạn sẽ cần đăng nhiều hơn mã giả để được trợ giúp về điều này. – JohnnyHK

+0

Mất bao lâu để truy vấn khi bạn chạy nó tại dòng lệnh, thay vì qua nút? –

Trả lời

1

Bể kết nối là giải pháp tốt để xử lý nhiều yêu cầu đồng thời. Nhưng thay vì sử dụng 'nhóm tài nguyên chung', tại sao chúng ta không thể sử dụng một hồ bơi mysql cụ thể?

này link nói về, 'nút-mysql bơi' mà là một kết nối hồ bơi MySQL cho Node.js

+0

Có thể tốt hơn bằng cách sử dụng 'node-mysql' của' createPool ({}) 'chức năng để tạo ra một hồ bơi kết nối –

1

Disclaimer: Tôi đã viết các module để giải quyết các loại vấn đề.

npm install mysql-simple-pool 

Bây giờ bạn có thể định cấu hình nhóm kết nối của mình. Tôi sử dụng tối đa 100 kết nối.

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

Bây giờ bạn có thể viết chức năng thử nghiệm sẽ đưa điều này vào thử nghiệm.

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

Và đây là sản phẩm ...

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 

Lần đầu tiên xung quanh nó dành một chút thời gian thiết lập các kết nối. Hy vọng điều này sẽ giúp ~

Các vấn đề liên quan