Я недавно унаследовал проект, который использует Spring для Net и nHibernate, и я начал получать повторяющуюся ошибку на наших Live-серверах, которые требуют срочного исправления.
Я не эксперт по Spring или nHibernate, я только начинаю выяснять, что делают технологии и для чего нужны разные настройки (т. Е. Я начинающий).
Я обновил сайт с весенней версии 1.2 до 1.3 и nHibernate с 1.2 до 2.1, и эта ошибка начала распространяться и теперь становится очень регулярной.
Информация об исключении:
Тип исключения: ConfigurationErrorsException
Сообщение об исключении: Ошибка создания контекста «spring.root»: Существующий контекст> «[spring.root]: WebApplicationContext (xxxxxxxx)» уже зарегистрирован под именем «spring.root».
Примечания об ошибке и развертывании:
У нас есть 20 веб-сайтов в IIS 6, использующих другую копию кода, все обращаются к базам данных diff, и всем назначен их собственный пул приложений.
Похоже, ошибка возникает, когда пользователь пытается получить доступ к странице, на которой он не был при первоначальном обращении к сайту (с момента последнего перезапуска пула приложений). Если мы перезапустим пул приложений, проблема больше не возникнет на этой странице, если только мы не перезапустим пул, потому что эта проблема возникла на другой странице.
Я не уверен, что проблема возникает, потому что у нас есть несколько сайтов, пытающихся получить доступ к одному и тому же контексту весны, или у каждого сайта есть свой собственный контекст весны. У меня сложилось впечатление, что, когда пользователь пытается получить доступ к сайту, если сайт не был доступен раньше, пружина настроит инъекции для всех объектов (поэтому первая страница загружается после загрузки немного времени). Перезапуск IIS или перезапуск пула приложений).
Я просматривал пример кода Spring for Net, и его настройки очень похожи в файлах web.config, dao.xml, web.xml ...
Web.config:
<sectionGroup name="spring">
<section name="context" type="Spring.Context.
Support.WebContextHandler, Spring.Web"/>
<section name="parsers" type="Spring.
Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
</sectionGroup>
<spring>
<parsers>
<parser type="Spring.Data.
Config.DatabaseNamespaceParser, Spring.Data"/>
<parser type="Spring.Transaction.Config.
TxNamespaceParser, Spring.Data"/>
</parsers>
</spring>
<context>
<resource uri="~/conf/Aspects.xml"/>
<resource uri="~/conf/Dao.xml"/>
<resource uri="~/conf/Services.xml"/>
<resource uri="~/conf/Web.xml"/>
</context>
<appSettings>
<add key="Spring.Data.NHibernate.Support.
OpenSessionInViewModule.SessionFactoryObjectName"
value="SessionFactory"/>
</appSettings>
Различия в dao.xml:
- использование HibernateTransactionManager, а не транзакцииManager
- использование HibernateGenericTemplate
- использование Spring.Data.NHibernate.LocalSessionFactoryObject, где в примере используется объект Custom Session Factory, который наследуется от LocalSessionFactoryObject
- у нас нет
<property name="ExposeTransactionAwareSessionFactory" value="true" />
, нужно выяснить, что это делает.
Я буду продолжать читать документацию по Spring for Net, чтобы попытаться понять, почему это происходит. Хотя, если это общая проблема, любая помощь будет оценена.