我使用Spring Hibernate模板apache tomcat和MySQL。一切都在开发中很有效,但是当我将应用程序部署到测试服务器并让它在一夜之间运行(大部分空闲)时,我通常会在早上对此表示欢迎:
以下是我的spring servlet.xml:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver" >
<property name="maxUploadSize" value="1000000"/>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" />
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${jdbc.dialect}</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
如何配置spring servlet.xml以避免此问题?感谢。
答案 0 :(得分:1)
您可以使用hibernate属性设置会话池,也可以配置超时。
<property name="hibernate.c3p0.timeout">300</property>
。
希望这会对你有所帮助。
答案 1 :(得分:0)
您需要检查SQL日志。会话已超时,因为某些查询的时间比默认的事务超时时间长。
赋予它更大的价值无法解决您的问题。因此,您需要配置jdbcdslog之类的工具来拦截所有查询并记录慢速查询。
通过这种方式,您可以确定需要花费多长时间。它可能是一个低效的查询或许多小的查询(N + 1选择),而不是通过连接更好地优化。
通过这种方式,您还可以确定哪些查询需要更多索引。
或者,您可以计划设置二级查询缓存,以加快一些很少更改的sloq查询。
答案 2 :(得分:0)
嗨@jans据说我们不应该使用hibernate内置连接池生产。您可以使用C3p0进行连接池以避免错误。 同样来自我学到的东西,请确保您关闭所有使用过的课程。 您可以在“hibernateProperties”属性中添加以下代码。
<prop key= "hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
<prop key="hibernate.c3p0.acquire_increment">5</prop>
<prop key="hibernate.c3p0.idle_test_period">300</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.timeout">1800</prop>