2013-03-25 18 views
11

Tôi đang viết một máy chủ web Node.js sử dụng cơ sở dữ liệu Postgres. Tôi đã từng kết nối với từng yêu cầu mới như sau:Làm cách nào để sử dụng nút-postgres trong máy chủ?

app.get('/', function (req, res) { 
    pg.connect(pgconnstring, function (err, client) { 
    // ... 
    }); 
}); 

Nhưng sau một vài yêu cầu, tôi nhận thấy lỗi 'hết bộ nhớ' trên Heroku khi cố kết nối. Cơ sở dữ liệu của tôi chỉ có 10 hàng, vì vậy tôi không thấy điều này có thể xảy ra như thế nào. Tất cả các truy cập cơ sở dữ liệu của tôi là của mẫu này:

client.query('SELECT * FROM table', function (err, result) { 
    if (err) { 
    res.send(500, 'database error'); 
    return; 
    } 

    res.set('Content-Type', 'application/json'); 
    res.send(JSON.stringify({ data: result.rows.map(makeJSON) })); 
}); 

Giả sử rằng các lỗi bộ nhớ là do có một số kết nối liên tục để cơ sở dữ liệu, tôi chuyển sang một phong cách tôi nhìn thấy ở một số node-postgres ví dụ về kết nối một lần duy nhất tại trên cùng của tệp:

var client = new pg.Client(pgconnstring); 
client.connect(); 

app.get('/', function (req, res) { 
    // ... 
}); 

Nhưng bây giờ yêu cầu của tôi bị treo (vô thời hạn?) khi tôi cố thực hiện truy vấn sau khi kết nối bị gián đoạn. (Tôi mô phỏng nó bằng cách giết chết một máy chủ Postgres và đưa nó trở lại.)

Vậy làm cách nào để thực hiện một trong những điều này?

  1. Kết nối Postgres đúng cách để tôi có thể 'kết nối lại' mỗi lần mà không hết bộ nhớ.
  2. Yêu cầu khách hàng toàn cầu tự động kết nối lại sau khi lỗi mạng.

Trả lời

16

Tôi giả sử bạn đang sử dụng phiên bản mới nhất của các nút postgres, trong đó việc kết nối tổng hợp đã được cải thiện rất nhiều. Bây giờ bạn phải kiểm tra kết nối trở lại vào hồ bơi, hoặc bạn sẽ chảy máu các kết nối:

app.get('/', function (req, res) { 
    pg.connect(pgconnstring, function (err, client, done) { 
    // do some stuff 
    done(); 
    }); 
}); 

Đối với xử lý trên một kết nối toàn cầu lỗi (# 2, nhưng tôi muốn sử dụng hồ bơi):

client.on('error', function(e){ 
    client.connect(); // would check the error, etc in a production app 
}); 

Tài liệu "bị thiếu" cho tất cả điều này là trên GitHub wiki.

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