我有一个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>
答案 0 :(得分:0)
我认为我们不能告诉你问题是什么。这将是应用程序在启动期间正在做的事情,我们只能猜测它会是什么。
然而......
应该做的是在启动期间对应用程序进行概要分析,并使用概要分析来确定大部分时间花在哪里。然后看看你是否可以弄清楚它在做什么......并对其进行优化。
打开GC日志记录以查看内存使用/垃圾收集是否是问题的一部分也是如此。同样,检查数据库活动是否是一个重要的瓶颈。
最后,找到问题原因的一个重要步骤可能是了解应用程序的内部体系结构。特别是如果这是多年来从开发人员传递给开发人员的代码。
答案 1 :(得分:0)
由于您没有发布问题的完整详细信息,例如hibernate,spring和其他应用配置,因此建议您解决方案有点困难。以下可能是可能的:
某处可能会在应用程序加载期间出现死锁。例如,批处理作业在容器完全启动之前在后台运行。
如果在容器启动后总是检查数据库模式是否更新,并且您的数据库中包含大量具有大量数据的表和列,那么在应用程序加载完成之前肯定需要一些时间。
检查服务器配置,例如是否有另一个并行运行的应用程序实例导致延迟。