弹簧应用需要很长时间才能启动

时间:2017-09-15 03:59:32

标签: java spring hibernate

我有一个java应用程序,我正在使用Spring和Hibernate框架。在我的生产环境中,如果在10分钟内正确启动应用程序,则需要很长时间(最多一个小时)。我可以看到登录页面,但如果我尝试登录,它将继续处理。只有一个小时左右,我才能登录。

经过一些研究后,我发现默认hibernate.temp.use_jdbc_metadata_defaults设置为true,在这种情况下需要时间,因此我将其设置为false。现在,当我将其指向生产数据库进行测试时,我的应用程序在本地系统中快速启动。即使在测试环境中,它也能按预期执行。但是当我把它推向生产时,它最初工作得很好,但现在又开始了很长时间。

现在知道如何处理它?<​​/ p>

已编辑:添加更多详情: 初始启动时间很长。一旦它上升,那么页面将加载正常。我们正在使用postgres db并有多个模式。请建议需要哪些其他细节

以下是会话工厂配置:

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="mydb"/>     
    <property name="entityInterceptor" ref="nullToEmptyStringInterceptor" />
    <property name="hibernateProperties">
       <props>
           <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
           <prop key="hibernate.multiTenancy">SCHEMA</prop>
           <prop key="hibernate.tenant_identifier_resolver">path_to.DataBaseResolver</prop>
           <prop key="hibernate.multi_tenant_connection_provider">path_to.MultiTenantProvider</prop>      
           <prop key="hibernate.show_sql">false</prop>
           <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
       </props>
    </property> 
    <property name="packagesToScan">
       <list>
           <value>path_to_model_package</value>            
       </list>
    </property>
</bean>

以下是entityManagerFactory配置

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="mydb" />
    <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
    <property name="jpaDialect" ref="jpaDialect" />
    <property name="persistenceUnitName" value="myPersistenceUnit" />
    <property name="packagesToScan" >
        <list>
            <value>path_to_model_package</value>
        </list>
    </property>
     <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
            <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
            <prop key="hibernate.jdbc.use_get_generated_keys" >true</prop>
        </props>
    </property>

</bean>

2 个答案:

答案 0 :(得分:0)

我认为我们不能告诉你问题是什么。这将是应用程序在启动期间正在做的事情,我们只能猜测它会是什么。

然而......

应该做的是在启动期间对应用程序进行概要分析,并使用概要分析来确定大部分时间花在哪里。然后看看你是否可以弄清楚它在做什么......并对其进行优化。

打开GC日志记录以查看内存使用/垃圾收集是否是问题的一部分也是如此。同样,检查数据库活动是否是一个重要的瓶颈。

最后,找到问题原因的一个重要步骤可能是了解应用程序的内部体系结构。特别是如果这是多年来从开发人员传递给开发人员的代码。

答案 1 :(得分:0)

由于您没有发布问题的完整详细信息,例如hibernate,spring和其他应用配置,因此建议您解决方案有点困难。以下可能是可能的:

  1. 某处可能会在应用程序加载期间出现死锁。例如,批处理作业在容器完全启动之前在后台运行。

  2. 如果在容器启动后总是检查数据库模式是否更新,并且您的数据库中包含大量具有大量数据的表和列,那么在应用程序加载完成之前肯定需要一些时间。

  3. 检查服务器配置,例如是否有另一个并行运行的应用程序实例导致延迟。