Каков правильный способ управления соединениями MongoDB в ASP.Net MVC?
Какова наилучшая практика для управления жизненным циклом класса MongoServer? Должен ли я создать его и закрыть его в конце каждого запроса или он должен храниться в виде сингла на всю жизнь приложения, используя что-то вроде StructureMap?
Любая помощь ценится.
Ответы
Ответ 1
В официальная документация указано, что MongoServer
, MongoDatabase
и MongoCollection
являются потокобезопасными и что вы" Предполагается создать один MongoServer
для каждой базы данных, к которой вы подключаетесь.
Таким образом, MongoServer
, MongoDatabase
и MongoCollection
можно безопасно настроить как одиночные. MongoServer
даже поможет принудительно выполнить это, возвращая тот же экземпляр MongoDatabase
для последовательных вызовов, а MongoDatabase
сделает то же самое для MongoCollection
s.
т.е. ваш экземпляр MongoServer
может быть надежно настроен на использование образа oneton в вашем контейнере IoC, и вы также можете настроить инъекцию для MongoDatabase
и, возможно, даже MongoCollection
.
Я использую эту стратегию самостоятельно с Виндзором - здесь вы можете увидеть мой MongoInstaller
: https://gist.github.com/2427676 - он позволяет моим классам просто продолжайте и делайте это:
public class SomeClass
{
public SomeClass(MongoCollection<Person> people)
{ ... }
}
чтобы иметь инъецированную коллекцию, красивую и готовую к использованию.
Ответ 2
Драйвер С# автоматически управляет подключениями к серверу (он использует пул соединений). Нет необходимости звонить на сервер. Подключитесь, когда драйвер подключается автоматически. Не вызывайте server.Disconnect, поскольку это закрывает все подключения в пуле соединений и препятствует эффективному объединению пулов.
Что касается управления жизненным циклом экземпляра MongoServer, вы можете хранить его в статической переменной и использовать его для жизни вашего процесса (и делиться им по потокам, это поточно-безопасный). Кроме того, вы можете просто вызвать MongoServer.Create снова, когда вам нужно получить экземпляр сервера. Пока вы продолжаете называть MongoServer.Create с той же строкой соединения, вы будете продолжать возвращать тот же экземпляр MongoServer.
Ответ 3
Внедрить его с помощью любого контейнера IOC (structuremap, Windsor и т.д.) и сохранить его время жизни на основе запроса.