в нашей компании, это своего рода стандарт для создания репозиториев для данных, которые изначально хранятся в как описано, например, в https://thinkinginobjects.com/2012/08/26/dont-use-dao-use-repository/.Лучше ли хранить хранилище для каждого веб-приложения (контекста) или лучше использовать общий экземпляр JNDI или аналогичный метод
Наша веб-инфраструктура состоит из нескольких независимых веб-приложений в Tomcat 7 для печати, описания продукта, заказа продукта (это не сохраняется в базе данных!), Описание категории и т. Д. Все они основаны на API Servlet 2.
Таким образом, каждый экземпляр/реализация хранилища хранит специализированный вид данных, представляемых сериализуемыми классами, и экземпляры этих сериализуемых классов настраиваются/заполняются периодически выполняемым запросом базы данных (для каждого результата создаются сеттеры полей , напоминает мне о объектно-ориентированных объектных компонентах с CMP). Репозитории инициализируются последовательностями инициализации сервлетов (поэтому каждый сервлет сохраняет собственный набор экземпляров). Каждый контекст имеет собственное соединение с базой данных Oracle (настроено файлом описания ресурсов при развертывании). Все данные доступны только для чтения, нам больше не нужно писать обратно в базу данных.
Поскольку нам нужны некоторые из этих типов данных для более чем одного веб-приложения (контекста), а некоторые даже для более одного сервлета в пределах одного и того же хранилища веб-контекста с идентичным типом данных создаются несколько раз - например. четыре раза, дважды в одном приложении.
В конце некоторые данные удвоены, и я не уверен, насколько это так умно и эффективно, как должно быть. Должна быть доступна возможность совместного использования одного и того же объекта репозитория более чем с одним приложением (JNDI?), Но, по крайней мере, должно быть возможно предоставить его для нескольких сервлетов в одном и том же контексте приложения. Несмотря на то, что я раздражен идеей использовать репозиторий «self build», а не что-то вроде хорошо протестированного открытого кэша (ehcache, jcs, ...), потому что некоторые из этих кэшей также предоставляют параметры для распределенных кешей (так он также должен работать в одном контейнере). Если поиск выполняется в определенных записях, алгоритм поиска выполняет итерацию по всем позициям в ссылке репозитория (см. Выше). Для каждого шаблона поиска существуют специализированные функции, которые непосредственно вызываются из классов бизнес-логики с использованием «entity beans»; нет спецификационного объекта или интерфейса.
В конце концов, сервер приложений в целом не работает так хорошо, и он использует много ОЗУ (по крайней мере, для приблизительно 10000 записей в БД); это, на мой взгляд, скорее всего, связано с использованием сериализуемых классов XSD-to-JAXB.
Кроме того, каждый раз, когда приложение развертывается для тестирования, вы должны ждать не менее двух минут, пока все записи базы данных не будут загружены в репозитории - при развертывании в режиме реального времени есть хорошо узнаваемая фаза обслуживания в контексте/сервлет запускать. Я склонен думать, что все это тесно связано с решениями, описанными выше.
Поскольку у меня нет опыта в этой области, и я новичок в компании, я не хочу быть навязчивым.
Может быть, вы можете мне помочь оценить идеи для лучшей установки:
это для производительности и памяти лучше объединить все репозитории в одном «хранилище сервлетов» и объектов запроса оттуда через HTTP (не так думаю, хотя он кажется довольно модульным/распределенным в системе) или я должен попытаться пойти с JNDI (никогда раньше этого не делал) и подключиться к репозиторию, подобному базе данных JDBC?
Не было бы еще более разумным, быстрым и эффективным, по крайней мере, использовать только один пул соединений для всего Tomcat (и ссылаться на этот пул соединений из дескриптора развертывания веб-приложений)? Или это может замедлить соединение или ограничить его в любом другом аспекте? Мне сказали, что система кеша (ehcache) не работает хорошо (по крайней мере, не с выполнением собственного письменного решения - хотя: я не могу в это поверить). Я полагаю, что использование репозиториев, поддерживаемых распределенным (как во всех контекстах) кешем, используемым во всех веб-приложениях, должно не только значительно уменьшить объем памяти, но и не будет значительно медленнее. - Я считаю, что это будет быстрее и у них будет более короткое время запуска, соответственно, не нужно будет часто перераспределять его.
Я очень благодарен за каждый совет или подсказку и ваши мысли. Было бы замечательно получить экспертную оценку моих идей на основе практического опыта.
Так что спасибо вам большое!
Большое спасибо за ваш ответ. Возможно, я не понимаю, что означает общие объекты/ресурсы. Я предположил, что следующая информация предоставляет концепции с использованием того же механизма, который используется для общих пулов баз данных для совместного использования общего источника данных (репозиторий не должен отличаться концептуально) не только от нескольких сервлетов одного приложения, но и от контекстов серверной апликации: * https://tomcat.apache.org/tomcat-8.0-doc/jndi-resources-howto.html * http://docs.oracle.com/javaee/6/tutorial/doc/bnafo.html#bnafp – recursion
Вы пишете: «Распределенные кэши должны проходить через сеть и добавлять служебные данные для сериализации/десериализации». Почему кеш (это должно быть функциональное описание) не может использоваться в разных контекстах приложения в одном и том же веб-контейнере? Репозитории, которые мы используем, - это умножение данных. Поэтому каждое обновление (жизненный цикл репозитория - «load => sleep n seconds => load => sleep n seconds => ...»; где-то между запросами для разных объектов в этом кеше) выполняется несколько раз, даже в том же приложении. Это кажется расточительной архитектурой? – recursion
«Выполняйте обычную домашнюю работу по программированию, выполняйте профилирование и анализ и проводите настройку в нужных местах». Конечно, я делаю это, и я продолжу. Но, кроме того, я стараюсь отступить и посмотреть на архитектуру и концепции в целом. Мой поздний cs prof однажды сказал: «Вы можете оптимизировать сдавливание лимона в течение многих лет, но если ваш клиент встал на оранжевый лимонад, вы должны просто взять оранжевый цвет.« Прежде чем оптимизировать строки кода, я бы хотел использовать разумную архитектуру. Возможно, это не сам код, связанный с программированием и алгоритмами. – recursion