2017-09-15 201 views
-1

我有一個Java應用程序,使用Spring和Hibernate框架。在我的生產環境中,正常啓動應用程序需要很長的時間(最多一小時),例如在10分鐘內。我可以看到登錄頁面,但如果我嘗試登錄,它會繼續處理。只有一個小時左右後,我才能登錄。彈簧應用程序啓動時間太長

經過一番研究,我發現默認hibernate.temp.use_jdbc_metadata_defaults設置爲true,在這種情況下需要時間,所以我將它設置爲false。現在我的應用程序在我的本地系統中快速啓動,當我將它指向生產數據庫進行測試時。即使在測試環境中,它也能按預期執行。但是當我把它投入生產時,它最初運行良好,但現在再次啓動時間太長。

任何想法現在如何處理它?

編輯:增加更多細節: 初始啓動時間是巨大的。一旦它起來,那麼頁面將加載正常。我們使用postgres數據庫並有多個模式。請建議需要什麼其他細節

下面是會話工廠onfiguration:

<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> 
+0

組件掃描中有多少個bean文件? –

+0

所有軟件包都包含在組件掃描中。這是一箇舊的應用程序,在我之前工作的人已經做到了這一點。我不知道我必須改變多少。 –

+0

如果從數據庫加載所有記錄並在UI中顯示可能會導致此問題,因爲顯然生產的記錄比本地或測試環境要多。 如果是這種情況,請嘗試實現分頁功能來從數據庫加載有限記錄 – Ramesh

回答

0

我不認爲我們可以告訴你的是什麼問題。在啓動過程中,應用程序正在做,我們只能猜測它會是什麼。

但是......

什麼你應該做的是在啓動過程中分析的應用程序,並使用概要分析來確定大部分的時間被消耗。然後看看你是否可以弄清楚它在做什麼,並優化它。

也可以開啓GC日誌記錄來查看內存使用情況/垃圾回收是否是問題的一部分。同上檢查數據庫活動是否是一個重大瓶頸。

最後,找到這個問題的原因的一個重要步驟可能是理解應用程序的內部架構。特別是如果這是在很多年之內從開發人員傳遞給開發人員的代碼。

0

因爲你沒有發佈你的問題的全部細節,如休眠,春天和其他應用程序配置,所以建議你的解決方案有點困難。以下可能是可能的:

  1. 某處在應用程序加載時可能會出現死鎖。例如,批量作業在容器完全啓動之前在後臺運行。

  2. 如果您的數據庫模式總是在容器啓動後檢查更新並且您的數據庫有大量的表和列以及大量數據,那麼在應用程序加載完成之前肯定需要時間。

  3. 檢查服務器配置,如是否存在導致延遲的並行運行的另一個應用程序實例。

相關問題