Spring MVC& Hibernate在8小时后停止工作

时间:2017-07-03 10:59:05

标签: mysql xml spring hibernate configuration

以下xml配置文件在使用此错误8小时不活动后停止工作:

错误:已经关闭。

25-may-2017 8:45:23 org.apache.catalina.core.StandardWrapperValve invoke

Servlet.service() for servlet [dispatcher] in the context with path [/system] threw exception [Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin transaction failed: ] with root cause:
java.net.SocketException: **Software caused connection abort: recv failed**

以下是配置文件:

<context:component-scan base-package="es.company.system.persistence" />

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="es.mypackage.model"></property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <prop key="hibernate.show_sql">false</prop>
        </props>
    </property>
</bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">

    <property name="connection.driver_class" value="com.mysql.jdbc.Driver" />
    <property name="connection.url" value="jdbc:mysql://localhost:3306/system" />
    <property name="connection.username" value="???" />
    <property name="connection.password" value="???" />

    <property name="hibernate.c3p0.min_size" value="5" />
    <property name="hibernate.c3p0.max_size" value="20" />
    <property name="hibernate.c3p0.timeout" value="1800"/>
    <property name="hibernate.c3p0.max_statements" value="50" />

    <property name="hibernate.c3p0.testConnectionOnCheckout" value="true" />

    <property name="hibernate.c3p0.privilegeSpawnedThreads" value="true" />
    <property name="hibernate.c3p0.contextClassLoaderSource" value="library" />

</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="persistenceExceptionTranslationPostProcessor"
    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

<tx:annotation-driven transaction-manager="transactionManager" />

我目前正在使用Spring MVC 4.3.8和Hibernate 4.1.9。用于MySQL的C3P0连接池。我认为C3P0会解决这个问题,但事实并非如此。 谁知道什么是错的?

感谢!!!

2 个答案:

答案 0 :(得分:2)

软件导致连接中止:recv失败 - 这通常意味着存在网络错误,例如TCP超时。

还为hibernate.c3p0.timeout

设置了默认值为0的超时参数
  

hibernate.c3p0.timeout - 从中​​删除空闲连接时   游泳池(第二名)。 Hibernate默认值:0,永不过期。

设置autoReconnect, hibernate.c3p0.autoReconnect = true 或作为url连接参数: jdbc:mysql:// localhost:3306 / test?autoReconnect = true

添加< property name="hibernate.c3p0.preferredTestQuery">SELECT 1</property> 并检查c3p0执行它的日志(如果没有从限制1的实际表中添加实数选择计数(1))。还要检查网络超时

答案 1 :(得分:1)

我有一段时间经历过谷歌云sql的问题,其中SQL服务器在10小时空闲时间后中断所有连接。但是在应用程序中,我们仍然拥有sessionFactory实例并且可以创建会话,但是当您实际触发数据库查询时,它会因连接异常中断而失败。

以下尝试都没有奏效。 1.在连接URL中设置自动重新连接 2. xml文件中的自动重新连接,超时,验证属性。 3.写了一个轮询服务来进行jdbc调用,以便每8小时保持连接活动(<10小时空闲超时时间) 4.为每个数据库操作关闭并打开新的sessionFactory。

最后,我创建了一个轮询服务,它将关闭sessiongFactory并创建一个新的。 注意:在sessionFactory对象上调用close方法是不够的。您需要将其显式设置为null; 这可能是一种解决方法,但它使我免于从应用程序的一天重新启动。 我没有使用Spring休息服务和hibernate。