0

I have Spring project which produces 42MB war file. Whenever I deploy it in a server it is taking more than an hour with tomcat 7. Even in development environment it is consuming more than 20 mins in the local environment if we make any changes in it.

I suspect I have a major mistake.

<?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:cache="http://www.springframework.org/schema/cache"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
       http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">

<context:component-scan base-package="com.abc.xyz.server.filters" />
<context:component-scan base-package="com.abc.xyz.server.utils" />
<context:component-scan base-package="com.abc.xyz.server.application.Bean" />
<context:component-scan
    base-package="com.abc.xyz.server.application.controllers" />
<context:component-scan
    base-package="com.abc.xyz.server.application.services" />
<jpa:repositories
    base-package="com.abc.xyz.server.application.repositories" />

<mvc:annotation-driven>
    <mvc:message-converters>
        <!-- Use the HibernateAware mapper instead of the default -->
        <bean
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
            <property name="objectMapper">
                <bean
                    class="com.abc.xyz.server.utils.HibernateAwareObjectMapper" />
            </property>
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<!-- <bean id="jdbcEmployeeDAO" class="com.abc.xyz.server.application.model.dao.JDBCEmployeeDAOImpl"> 
    </bean> -->


<bean id="jdbcProperty"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>/WEB-INF/application.properties</value>
    </property>
</bean>

<bean id="abstractDataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
    p:username="${jdbc.username}" p:password="${jdbc.password}">

    <property name="initialSize" value="0" />

    <property name="maxIdle" value="1" />

    <property name="minIdle" value="0" />

    <property name="validationQuery" value="SELECT 1" />

    <property name="testOnBorrow" value="true" />

    <property name="testWhileIdle" value="true" />

    <property name="timeBetweenEvictionRunsMillis" value="180000" />

    <property name="numTestsPerEvictionRun" value="100" />

    <property name="minEvictableIdleTimeMillis" value="120000" />

    <property name="removeAbandonedTimeout" value="60" />

    <property name="logAbandoned" value="true" />

    <property name="maxActive" value="30" />

    <property name="maxWait" value="3000" />

    <property name="removeAbandoned" value="true" />
</bean>

<bean id="concreteDataSourceOne" parent="abstractDataSource"
    p:url="${jdbc.databaseurlOne}" />
<bean id="concreteDataSourceTwo" parent="abstractDataSource"
    p:url="${jdbc.databaseurlTwo}" />
<bean id="concreteDataSourceDev" parent="abstractDataSource"
    p:url="${jdbc.databaseurlDev}" />
<bean id="concreteDataSourceGlace" parent="abstractDataSource"
    p:url="${jdbc.databaseurlGlace}" />


<bean id="dataSource"
    class="com.abc.xyz.server.datasource.TennantAwareDataSource">
    <property name="targetDataSources">
        <map key-type="java.lang.String">
            <entry key="database2" value-ref="concreteDataSourceTwo" />
            <entry key="database1" value-ref="concreteDataSourceOne" />
            <entry key="dev" value-ref="concreteDataSourceDev" />
            <entry key="glace" value-ref="concreteDataSourceGlace" />
        </map>

    </property>
    <property name="defaultTargetDataSource" ref="concreteDataSourceGlace" />
</bean>

<bean id="objectmapper" class="com.fasterxml.jackson.databind.ObjectMapper"></bean>

<bean id="EntityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:persistenceUnitName="PersistenceUnit" p:dataSource-ref="dataSource">
    <!-- THIS IS WHERE THE MODELS ARE -->
    <property name="packagesToScan"
        value="com.abc.xyz.server.application.models" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
            p:showSql="${hibernate.show_sql}" p:generateDdl="false"
            p:databasePlatform="${hibernate.dialect}" />
    </property>
</bean>

<!-- Ecache related stuff -->
<!-- <cache:annotation-driven /> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" 
    p:cache-manager-ref="ehcache"/> <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" 
    p:config-location="classpath:ehcache.xml" p:shared="true"/> -->

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="EntityManagerFactory" />
</bean>
<tx:annotation-driven />
<bean id="sessionMap" class="com.abc.xyz.server.utils.SessionMap"
    scope="session">

    <!-- this next element effects the proxying of the surrounding bean -->
    <aop:scoped-proxy />
</bean>

<!-- Configuration Bean -->

<mvc:default-servlet-handler />
<mvc:interceptors>
    <bean class="com.abc.xyz.server.utils.EMRRequestInterceptor" />
</mvc:interceptors>
<!-- Swagger --><!-- 
<context:property-placeholder location="classpath:/swagger.properties" />
<bean id="springSwaggerConfig"
    class="com.mangofactory.swagger.configuration.SpringSwaggerConfig" /> -->
<!-- File Upload -->    <!-- 
<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver" /> -->

I also get GC messages like this in the console.

[GC [PSYoungGen: 605920K->128K(660480K)] 1237105K->631313K(2058752K), 0.0141920 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]

Neil Stockton
  • 11,383
  • 3
  • 34
  • 29
nmkyuppie
  • 1,456
  • 1
  • 14
  • 30
  • this might help: http://stackoverflow.com/questions/1790474/war-deployment-on-tomcat-takes-ages – Tahir Hussain Mir Dec 28 '16 at 05:28
  • 1
    Could you copy the `deployment.war` on a fresh tomcat installation? Then, check how long does it take to start. – Cahit Gungor Dec 28 '16 at 05:41
  • 1
    A coupe of things, I suggest using a single `component-scan` element, the `base-package` takes a `,` separated list so you don't need multiple. You also have `` and a `PropertyPlaceholderConfigurer` which again is a duplicate. Just add the `/WEB-INF/application.properties` as a value to the `location` attribute of the ``. For the remainder nothing really strange. Make sure you don't log to much (i.e WARN or ERROR not DEBUG in production). – M. Deinum Dec 28 '16 at 07:20
  • Thanks for your reply. I have to add one more thing that in the mean time I'm getting GC log like this. **[GC [PSYoungGen: 605920K->128K(660480K)] 1237105K->631313K(2058752K), 0.0141920 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]** – nmkyuppie Dec 28 '16 at 07:36
  • which os is there ? – Nirav Shah Dec 28 '16 at 11:11
  • having Cent OS... – nmkyuppie Dec 29 '16 at 11:43

0 Answers0