2012-04-20 57 views
27

Thực hành tốt nhất để quản lý vòng đời lớp học MongoServer là gì? Tôi có nên tạo một và đóng nó vào cuối mỗi yêu cầu hoặc nó nên được giữ như là một singleton cho toàn bộ cuộc đời của ứng dụng bằng cách sử dụng một cái gì đó như StructureMap?Cách đúng để quản lý các kết nối MongoDB trong ASP.Net MVC là gì?

Mọi trợ giúp đều được đánh giá cao.

Trả lời

24

Trong the official documentation nó được tuyên bố rằng MongoServer, MongoDatabase, và MongoCollection là chủ đề an toàn, và rằng bạn đang nghĩ để tạo ra một đơn MongoServer cho mỗi cơ sở dữ liệu mà bạn kết nối.

Do đó, MongoServer, MongoDatabaseMongoCollection có thể được định cấu hình một cách an toàn thành người độc thân. MongoServer thậm chí sẽ giúp thực thi việc này bằng cách trả về cùng một phiên bản MongoDatabase cho các cuộc gọi liên tiếp và MongoDatabase sẽ làm điều tương tự cho MongoCollection s.

I.e. ví dụ MongoServer của bạn có thể được định cấu hình an toàn để có lối sống đơn trong thùng chứa IoC của bạn và bạn cũng có thể thiết lập tiêm cho MongoDatabase và thậm chí có thể cả MongoCollection.

Tôi đang sử dụng chiến lược này với Windsor bản thân mình - bạn có thể thấy tôi MongoInstaller đây: https://gist.github.com/2427676 - nó cho phép các lớp học của tôi chỉ cần đi trước và làm điều này:

public class SomeClass 
{ 
    public SomeClass(MongoCollection<Person> people) 
    { ... } 
} 

để có một bộ sưu tập tiêm, tốt đẹp và sẵn sàng để sử dụng.

+0

Cảm ơn bạn đã chia sẻ WindsorInstaller. Mã này là hơi cũ và tôi đã tự hỏi nếu bạn có một phiên bản cập nhật cho mongodriver mới 2.0? Tôi đã cố nâng cấp bản thân mình, nhưng tôi không chắc chắn liệu có cách nào tốt hơn? ' https://gist.github.com/kri5t/afcba8068badb62f5c9b –

2

Tiêm nó bằng bất kỳ thùng chứa IOC nào (structuremap, Windsor, vv ..) và duy trì tuổi thọ của nó theo yêu cầu.

+0

Điều đó có nghĩa là tạo một phiên bản của máy chủ cho mỗi chuỗi yêu cầu. Tôi cho rằng trình điều khiển xử lý nhóm kết nối. Đúng không? – Roman

+1

Vâng, 'MongoServer' quản lý một nhóm kết nối và KHÔNG có nghĩa là được khởi tạo lặp đi lặp lại. Xem http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial#CSharpDriverTutorial-TheC%23Driver để biết thêm thông tin ("Bạn sẽ tạo một cá thể của lớp này cho mỗi máy chủ mà bạn kết nối. Các kết nối đến máy chủ được xử lý tự động sau hậu trường (một hồ bơi kết nối được sử dụng để tăng hiệu quả). ") – mookid8000

7

Trình điều khiển C# tự động quản lý kết nối với máy chủ (nó sử dụng một nhóm kết nối). Không cần phải gọi server.Connect khi trình điều khiển tự động kết nối. Đừng gọi server.Disconnect khi đóng tất cả các kết nối trong nhóm kết nối và cản trở việc kết nối hiệu quả. Để quản lý vòng đời của cá thể MongoServer, bạn được tự do lưu trữ nó trong một biến tĩnh và sử dụng nó trong suốt quá trình của bạn (và chia sẻ nó qua các luồng, nó là an toàn luồng). Ngoài ra, bạn có thể chỉ cần gọi MongoServer.Create một lần nữa bất cứ khi nào bạn cần để có được cá thể máy chủ. Miễn là bạn tiếp tục gọi MongoServer.Create với cùng một chuỗi kết nối, bạn sẽ tiếp tục lấy lại cùng một cá thể MongoServer.

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