MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Xử lý thời gian chờ với Node.js và mongodb

CẬP NHẬT:
Dựa trên bài đăng này, có vẻ như họ đã triển khai bản sửa lỗi sẽ hoạt động giống như những gì chúng tôi làm ở đây. Không chắc liệu điều này đã có trong npm (15.10.13) hay chưa. https://github.com/mongodb/node -mongodb-native / issue / 1092 # ref-commit-2667d13

Sau một số cuộc điều tra, tôi đã cố gắng hiểu được điều gì đang xảy ra ở đó:
Mỗi khi bạn gọi bất kỳ phương thức nào để xử lý cơ sở dữ liệu (tìm, cập nhật, chèn, v.v.), nó sẽ tạo ra con trỏ, có ID riêng và tự đăng ký tới EventEmitter of Db để được gọi lại sau. Trong khi chờ đợi, nó tự đăng ký vào đối tượng _notReplied trong cùng một CallBackStore.

Nhưng khi kết nối bị đóng, tôi không thể tìm thấy bất kỳ thứ gì sẽ lặp lại qua các con trỏ _notReplied và sẽ kích hoạt chúng với lỗi hoặc bất kỳ logic nào với bộ hẹn giờ (nó vẫn có thể ở đâu đó). Vì vậy, tôi đã quản lý để viết các công việc nhỏ xung quanh, điều đó buộc kích hoạt con trỏ với lỗi khi DB phát ra close sự kiện:

new mongodb.Db('testdb', new mongodb.Server('localhost', 27017, { }), { safe: true }).open(function (err, db) {
  if (!err) {
    db.on('close', function() {
      if (this._callBackStore) {
        for(var key in this._callBackStore._notReplied) {
          this._callHandler(key, null, 'Connection Closed!');
        }
      }
    });

    // ...

  } else {
    console.log(err)
  }
});

Tôi khuyên bạn nên sử dụng phương pháp tiếp cận đầu tiên thay vì MongoClient. Rất ít lý do:ví dụ:khi bạn đóng kết nối rồi gọi .find nó sẽ kích hoạt lỗi đúng cách khi gọi lại, trong khi với MongoClient thì không.

Nếu bạn đang sử dụng MongoClient:

MongoClient.connect('mongodb://localhost:27017/testdb', function(err, db) {
  if (!err) {
    db.on('close', function() {
      if (this._callBackStore) {
        for(var key in this._callBackStore._notReplied) {
          this._callHandler(key, null, 'Connection Closed!');
        }
      }
    });

    // ...

  } else {
    console.log(err);
  }
});

Điều này sẽ làm gì? Sau khi kết nối bị đóng, nó sẽ lặp lại qua Tất cả con trỏ _notReplied và kích hoạt các sự kiện cho chúng với lỗi Connection Closed! .

Trường hợp thử nghiệm:

items.find({ }).toArray(function(err, data) {
  if (!err) {
    console.log('Items found successfully');
  } else {
    console.log(err);
  }
});
db.close();

Điều đó sẽ buộc đóng kết nối cơ sở dữ liệu và kích hoạt close sự kiện mà bạn xử lý trước đó và sẽ đảm bảo rằng con trỏ sẽ được đóng lại.

CẬP NHẬT:Tôi đã thêm Vấn đề trên GitHub: https://github.com / mongodb / node-mongodb-native / issue / 1092 chúng ta sẽ xem họ nói gì về điều này.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cập nhật bản ghi lồng nhau trong mảng mongodb khi bạn không biết chỉ mục tài liệu

  2. Ruby / rails:mongoid với mongo (đá quý); một cuộc xung đột bson? Làm thế nào để xử lý các phiên bản khác nhau?

  3. MongoDb:Tìm phần tử chung từ hai mảng trong một truy vấn

  4. Chuyển đổi dữ liệu MongoDB trên Tìm

  5. Chuẩn hóa dữ liệu trong MongoDB