【问题标题】:spring Hibernate session time out春季休眠会话超时
【发布时间】:2014-07-04 08:27:02
【问题描述】:

我正在使用 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 以避免这个问题?谢谢。

【问题讨论】:

  • 你刚才说你使用的是 apache tomcat 2.0 吗?

标签: spring hibernate spring-mvc spring-jdbc hibernate-tools


【解决方案1】:

您可以使用休眠属性来设置会话池,也可以配置超时。

&lt;property name="hibernate.c3p0.timeout"&gt;300&lt;/property&gt;.

希望这会对你有所帮助。

【讨论】:

  • 欲了解更多详情,请参阅:forum.hibernate.org/…
  • 好的,谢谢...但是我可以在哪里将此代码包含在我的 spring-servlet 中??我正在使用 spring 框架的休眠模板,...
【解决方案2】:

嗨@jans 据说我们不应该在生产中使用休眠内置连接池。您可以使用 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>

【讨论】:

  • C3P0 自带 hibernate 或者你可以在你的 pom.xml 中添加
【解决方案3】:

您需要检查 SQL 日志。会话已超时,因为某些查询花费的时间超过了默认的事务超时时间。

给它一个更大的值不会解决您的问题。因此,您需要配置像jdbcdslog 这样的工具来拦截所有查询并记录慢查询。

通过这种方式,您可以确定需要这么长时间。它可以是一个效率低下的查询,也可以是很多小的查询(N + 1 选择),使用连接可以更好地优化。

这样您还可以确定哪些查询需要更多索引。

或者,您可以计划设置二级查询缓存来加速一些很少更改的 sloq 查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多