Весеннее веб-приложение на Tomcat 8 - совместное использование объектов - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть веб-приложение Spring J2ee, которое скомпилировано в один файл .war

При работе в Apache Tomcat (8.0) DevOps определяет несколько Hosts с, каждый из которых ссылается на одно и то же (взорвано)) WebApp

server.xml:

<Host name="www.tenant1.com" appBase="webapps" xmlValidation="false" xmlNamespaceAware="false">
      <Context path="/tms" reloadable="false">
      <ResourceLink name="jdbc/tenant1" global="jdbc/all" type="javax.sql.DataSource"/>

      </Context>
</Host>

<Host name="www.tenant2.com" appBase="webapps" xmlValidation="false" xmlNamespaceAware="false">
      <Context path="/tms" reloadable="false">
      <ResourceLink name="jdbc/tenant2" global="jdbc/all" type="javax.sql.DataSource"/>

      </Context>
</Host>

Чем больше добавляется Hosts, тем больше времени требуется Tomcat для запуска (и тем больше используется кучи памяти).

Я уверен, что можно было бы добиться существенной эффективности, если бы можно было делиться экземплярами некоторых объектов (которые не зависят от хоста)

В качестве эксперимента я посмотрел на компонент вприложение под названием JaxbFactory, которое создает экземпляры некоторых объектов JAXBContext для демаршалинга файлов XML - потому что я знаю, что это дорого с точки зрения времени и памяти.

Я попытался сделать бин синглтоном и объявить JAXBContext статическим

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class JaxbFactory {

static JAXBContext reportContext;

  public JaxbFactory() throws Exception {
    if (reportContext == null) {
        reportContext = JAXBContext.newInstance(Constants.JaxbContext.report);
  }
}

Но все равно новый экземпляр reportContext создается для каждого Host (я подозревал, что это будетслучай, поскольку определение 'Singleton' в терминах жизненного цикла SpringBean не совпадает с исходным определением GoF)

Есть ли способ обмена экземплярами между Tomcat Host s?

...