У меня есть веб-приложение 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?