以下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会解决这个问题,但事实并非如此。 谁知道什么是错的?
感谢!!!
答案 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。