Tôi đã cố gắng để viết "mã tốt" và sử dụng tiêm phụ thuộc để vượt qua các đối tượng cơ sở dữ liệu trong các nhà xây dựng của các lớp học của tôi.Caching MongoDB đối tượng trong PHP
Constructors thường đang dùng hình thức này:
public function __construct(MongoDB $db) {
$this->collection = $db->collectionName;
}
tôi đã nhận thấy rằng đối với mỗi đối tượng được tạo ra, một mớiMongoCollection
được tạo ra. (Ví dụ: truy cập vào $db->collectionName
tài sản hai lần trả hai đối tượng riêng biệt, không phải là cùng một đối tượng)
Tôi đã sử dụng một lớp cơ sở ActiveRecord phong cách, do đó đối tượng có khả năng CRUD mình.
Bây giờ, khi tôi sử dụng một số chức năng getAllRecords()
và trả lại 100 trong số các đối tượng này, 100 trong số MongoCollection
đối tượng được tạo. (Xem nhanh nguồn trình điều khiển dường như chỉ ra các đối tượng mới được tạo ở đó, không chỉ các biểu diễn mới trong PHP)
Tôi đã giải quyết vấn đề này bằng cách gói cả các lớp Mongo
và MongoDB
để thực hiện bộ nhớ đệm.
class MyMongo extends Mongo
{
private $objectCache = array();
public function __get($name) {
return array_key_exists($name, $this->objectCache)
? $this->objectCache[$name]
: $this->objectCache[$name] = new MyMongoDB($this, $name);
}
}
class MyMongoDB extends MongoDB
{
private $objectCache = array();
public function __get($name) {
return array_key_exists($name, $this->objectCache)
? $this->objectCache[$name]
: $this->objectCache[$name] = new MongoCollection($this, $name);
}
}
Câu hỏi của tôi là như sau:
- Đây có phải là ý định hành vi của MongoDB? Nếu nó thực sự trả về một đối tượng mới mỗi lần, hoặc nó là một lỗi/tính năng trong trình điều khiển PHP hoặc bản thân Mongo (có một trường hợp sử dụng để cần 2 đối tượng cho cùng một bộ sưu tập không?)
- Tôi sẽ gây ra vấn đề cho bản thân mình bằng cách lưu vào bộ nhớ cache một trong hai/
MongoDB
vàMongoCollection
các đối tượng được tạo và sử dụng lại chúng. - Những người khác thường xử lý thao tác với MongoDB như thế nào? Tôi có nên sử dụng một cách tiếp cận hoàn toàn khác không? (Tức là DataMapper)
Cảm ơn,
Leigh.
Cảm ơn @ kristina, tôi nghĩ rằng bất kỳ thay đổi nào tôi cần phải thực hiện cho w hoặc wtimeout sẽ giống nhau trên tất cả các bộ sưu tập, vì vậy nó dường như chỉ là tên của bộ sưu tập mà tôi quan tâm. Tôi có thể hỏi cách bạn thường quản lý các đối tượng dữ liệu của mình không? Bạn có sử dụng ActiveRecord, DataMapper, cái gì khác, hoặc chỉ đơn giản là bất cứ điều gì có vẻ phù hợp nhất? – Leigh
Tôi đã viết trình điều khiển, vì vậy kiến thức của tôi về nó chủ yếu là lý thuyết :) Người dùng có kinh nghiệm thực tế hơn có lẽ tốt hơn đủ điều kiện để trả lời phần thứ ba của câu hỏi của bạn. – kristina
Tôi biết bạn đã viết trình điều khiển, đó là lý do tại sao tôi làm phiền bạn;) - Nhưng TY cho thời gian của bạn, tôi biết có một số người trong cuộc trò chuyện PHP người sử dụng Mongo, tôi sẽ đi và lỗi chúng. – Leigh