Как Вы управляете встроенными конфигурационными файлами и библиотеками в веб-приложениях Java?

Вот пример с использованием dplyr. Вы просто используете соответствующую строку формата даты за месяц %m или год %Y в инструкции format.

set.seed(123)
df <- data.frame(date = seq.Date(from =as.Date("01/01/1998", "%d/%m/%Y"), 
                                 to=as.Date("01/01/2000", "%d/%m/%Y"), by="day"),
                 value = sample(seq(5), 731, replace = TRUE))

head(df)
        date value
1 1998-01-01     2
2 1998-01-02     4
3 1998-01-03     3
4 1998-01-04     5
5 1998-01-05     5
6 1998-01-06     1

library(dplyr)

df %>%
mutate(month = format(date, "%m"), year = format(date, "%Y")) %>%
group_by(month, year) %>%
summarise(total = sum(value))

Source: local data frame [25 x 3]
Groups: month [?]

   month  year total
   (chr) (chr) (int)
1     01  1998   105
2     01  1999    91
3     01  2000     3
4     02  1998    74
5     02  1999    77
6     03  1998    96
7     03  1999    86
8     04  1998    91
9     04  1999    95
10    05  1998    93
..   ...   ...   ...
15
задан wds 24 February 2009 в 15:44
поделиться

5 ответов

Я работаю в среде, где отдельная команда сервера выполняет конфигурацию QA и Рабочих серверов для наших приложений. Каждое приложение обычно развертывается на двух серверах в QA и трех серверах в Производстве. Моя команда разработчиков обнаружила, что это лучше минимизировать сумму конфигурации, требуемой на сервере путем помещения как можно большего количества конфигурации в войне (или ухо). Это делает конфигурацию сервера легче и также сводит к минимуму вероятность, что команда сервера неправильно настроит сервер.

у Нас нет определенной для машины конфигурации, но у нас действительно есть определенная для среды конфигурация (Dev, QA и Производство). Нам сохранили конфигурационные файлы в военном файле, которые называет среда (напр. dev.properties, qa.properties, prod.properties). Мы помещаем-D свойство на командную строку Java VM's сервера для определения среды (напр. Java-Dapp.env=prod...). Приложение может искать app.env системное свойство и использовать его для определения названия файла свойств для использования.

я предполагаю, есть ли у Вас небольшое количество определенных для машины свойств тогда, Вы могли бы определить их как-D свойства также. Конфигурация палаты общин обеспечивает простой способ объединить файлы свойств с системными свойствами.

Мы настраиваем пулы соединения на сервере. Мы называем пул соединения тем же для каждой среды и просто указываем на серверы, которые присвоены каждой среде к соответствующей базе данных. Приложение только должно знать одно имя пула соединения.

6
ответ дан 1 December 2019 в 03:43
поделиться

конфигурационные файлы wrt, я думаю Steve , ответ является лучшим до сих пор. Я добавил бы предложение создания внешних файлов относительно пути установки военного файла - тот способ, которым у Вас может быть несколько установок войны в одном сервере с различными конфигурациями.

, например, Если бы мой dev.war распакован в /opt/tomcat/webapps/dev, то я использовал бы ServletContext.getRealPath для нахождения основной папки и военного имени папки, таким образом конфигурационные файлы будут жить в ../../config/dev относительно войны, или /opt/tomcat/config/dev для абсолюта.

я также соглашаюсь с [1 110] счет о помещении как можно меньше в эти внешние конфигурационные файлы. Используя базу данных или JMX в зависимости от Вашей среды для хранения столько, сколько это имеет смысл к. Apache Конфигурация палаты общин имеет хороший объект для обработки конфигураций, поддержанных таблицей базы данных.

Относительно библиотек, я соглашаюсь с [1 112] неизвестный , чтобы иметь все освобождение в WEB-INF/lib папка в военном (самоупакованном) файле. Преимущество состоит в том, что каждая установка приложения автономна, и у Вас могут быть различные сборки войны с помощью различных версий библиотек одновременно.

недостаток - то, что это будет использовать больше памяти, поскольку каждое веб-приложение будет иметь свою собственную копию классов, загруженных его собственным загрузчиком класса.

, Если это излагает реальное беспокойство, то Вы могли поместить банки в общую папку библиотеки для Вашего контейнера сервлета ($CATALINA_HOME/lib для кота). Все установки Вашего веб-приложения, работающего на том же сервере, должны использовать те же версии библиотек все же. (На самом деле это не строго верно, поскольку Вы могли поместить переопределяющие версии в папку индивидуума WEB-INF/lib при необходимости, но это становится довольно грязным для поддержания.)

я создал бы автоматизированный установщик для общих библиотек в этом случае, с помощью InstallShield или NSIS или эквивалентный для операционной системы. Что-то, что может помочь сказать, есть ли у Вас самый актуальный набор библиотек, и обновление, снижение, и т.д.

4
ответ дан 1 December 2019 в 03:43
поделиться

Я думаю что, если свойства являются конкретной машиной/развертыванием, то они принадлежат на машине. Если я собираюсь обернуть вещи в войне, это должно быть отбрасывание-innable, что не означает ничего, что это характерно для машины, на которой это работает. Эта идея повредится, если война будет иметь зависимые свойства машины в ней.

то, Что мне нравится делать, разрабатывают проект с properties.example файлом, каждая машина имеет .properties, который живет где-нибудь, война может получить доступ к нему.

альтернативный путь состоял бы в том, чтобы иметь задачи Ant, например, для dev-войны, войны этапа, войны напоминания и иметь наборы части свойств проекта, испеченного в в военной сборке. Мне не нравится это так же, потому что Вы собираетесь закончить тем, что имели вещи как расположение файлов на отдельном сервере как часть Вашей сборки проекта.

8
ответ дан 1 December 2019 в 03:43
поделиться

Я поместил всю конфигурацию в базу данных. Контейнер (Tomcat, WebSphere, и т.д.) предоставляет мне доступ к начальному соединению с базой данных и с тех пор, все выходит из базы данных. Это допускает несколько сред, кластеризации и динамических изменений без времени простоя (или по крайней мере без повторно развертывания). Особенно хороший способность изменить уровень журнала на лету (хотя Вам будут нужны или администраторский экран или в фоновое напоминание для взятия изменений). Очевидно, это только работает на вещи, которые не требуются, чтобы запускать приложение, но обычно, можно добраться до базы данных довольно быстро после запуска.

0
ответ дан 1 December 2019 в 03:43
поделиться

Я обычно делаю два файла свойств:

  • один для специфических особенностей приложения (сообщения, внутренние "волшебные" слова) встроенный в приложение,
  • другой для специфических особенностей среды (доступ дб, уровни журнала & пути...) представленный на пути к классу и "sticked" каждого сервера (не поставленный с моим приложением). Обычно я "mavenise" или "anttise" они один для помещения определенных значений, в зависимости от целевого ENV
  • Спокойные парни используют JMX для поддержания их приложения conf (conf, может быть изменен в в реальном времени, не повторно развертываясь), но это слишком сложно для моих потребностей.

Сервер (статичный?) библиотеки: Я сильно препятствую использованию библиотеки сервера в своих приложениях, поскольку оно добавляет зависимость к серверу:

  1. IMO, мое приложение должно быть "самоупаковано": отбрасывание моей войны, и это - все. Я видел войны с 20 МБ банок в нем, и это не является тревожащим для меня.
  2. А общая лучшая практика должна ограничить Ваши внешние зависимости тем, что предлагается догмой J2EE: J2EE API (использование Сервлетов, Ejbs, Jndi, JMX, JMS...). Ваше приложение должно быть "агностиком сервера".
  3. зависимости от Помещения в Вашем приложении (война, ухо, wathever) самодокументирует: Вы знаете, от каких библиотек Ваше приложение зависит. С сервером освобождает, необходимо ясно зарегистрировать эти зависимости, поскольку они менее очевидны (и скоро разработчики забудут это небольшое волшебство).
  4. при обновлении appserver возможности, что lib сервера Вы зависит от, также изменятся. Редакторы AppServer, как предполагается, не поддерживают совместимость на своем внутреннем, освобождает от версии до версии (и большую часть времени, они не делают).
  5. , Если Вы используете широко используемый lib, встроенный в Ваш appServer (джакартский вход свободного городского населения, иначе jcl, приходит на ум) и хотят к ugrade, это - версия для получения последних функций, Вы берете на себя огромный риск, что Ваш appServer не будет поддерживать его.
  6. при доверии статическому серверный объекту (в статическом поле класса сервера, например, Карте или журнале) необходимо будет перезагрузить appserver для очистки этого объекта. Вы освобождаете способность к горячему - повторно развертывают Ваше приложение (старый серверный объект будет все еще существовать между повторными развертываниями). Используя appServer-широкие объекты (кроме определенных J2EE) может привести к тонким ошибкам, особенно если этот объект совместно используется несколькими приложениями. Вот почему я сильно препятствую использованию объектов, которое находится в статическом поле appServer lib.

при абсолютной необходимости "в этом объекте в банке этого appserver", пытаются скопировать банку в приложении, надеясь, нет никакой зависимости от банки другого сервера и проверки classloading политики приложения (я беру привычку поместить "родителя в последний раз" classloading политика в отношении всех моих приложений: я уверен, что не буду "загрязнен" банками сервера - но я не знаю, является ли это "лучшая практика").

2
ответ дан 1 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: