Как использовать db4o IObjectContainer в веб-приложении?(Время жизни контейнера?)
-
21-09-2019 - |
Вопрос
Я оцениваю db4o на устойчивость для проекта ASP .NET MVC.
Мне интересно, как мне следует использовать IObjectContainer в веб-контексте в отношении времени жизни объекта.Насколько я понимаю, я могу сделать одно из следующих действий:
- Создайте IObjectContainer при запуске приложения и сохраните один и тот же экземпляр на протяжении всего времени существования приложения.
- Создайте один IObjectContainer для каждого запроса.
- Запустите сервер и получите клиентский IObjectContainer для каждого взаимодействия с базой данных.
Каковы последствия этих вариантов с точки зрения производительности и параллелизма?
Поскольку база данных блокируется при открытии IObjectContainer, я почти уверен, что вариант 2) вызовет у меня некоторые проблемы с параллелизмом - будет ли это также справедливо для варианта 1?
Насколько я понимаю, если я получаю объект из IObjectContainer, он должен быть сохранен тем же экземпляром IObjectContainer, чтобы db4o идентифицировал его как тот же объект.Следовательно, если я выберу вариант 3), мне придется получить исходный объект, внести необходимые изменения (скопировать данные из измененного объекта), а затем сохранить его, используя тот же IObjectContainer.Это правда ?
Решение
Вариант 1) может вызвать у вас серьезные проблемы, поскольку вы фактически разделите транзакцию между всеми запросами.Я не думаю, что это осуществимый вариант.
Как вы уже заметили, вариант 3) таит в себе свои опасности, поскольку вам придется отслеживать идентичность объекта вручную — утомительная и чрезвычайно подверженная ошибкам задача.Это действительно разрушает всю красоту объектной базы данных.Кроме того, насколько я знаю, накладные расходы на создание IObjectContainer
не мал, поэтому это будет слишком дорого.
Это в значительной степени оставляет нам вариант 2, который, насколько мне известно, не блокирует базу данных при открытии в режиме клиент-сервер - где вы нашли эту информацию?Поэтому лучшая идея — открыть IObjectServer
при запуске приложения и открыть новый IObjectContainer
по запросу или подключайтесь к удаленному серверу с помощью TCP по запросу.