【问题标题】:Database connection timeout数据库连接超时
【发布时间】:2010-06-15 19:02:23
【问题描述】:

我在互联网上阅读了很多关于这个问题的文章,但似乎没有一个明确的解决方案。请有人给我一个明确的答案,说明为什么我会遇到数据库超时。该应用程序是托管在 Tomcat 5.5 服务器上的 GWT 应用程序。我使用spring,会话工厂在applicationContext.xml中创建如下

<bean id="sessionFactory"
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${connection.dialect}</prop>
            <prop key="hibernate.connection.username">${connection.username}</prop>
            <prop key="hibernate.connection.password">${connection.password}</prop>
            <prop key="hibernate.connection.url">${connection.url}</prop>
            <prop key="hibernate.connection.driver_class">${connection.driver.class}</prop>
            <prop key="hibernate.show_sql">${show.sql}</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.c3p0.min_size">5</prop>
            <prop key="hibernate.c3p0.max_size">20</prop>
            <prop key="hibernate.c3p0.timeout">1800</prop>
            <prop key="hibernate.c3p0.max_statements">50</prop>
            <prop key="hibernate.c3p0.idle_test_period">300</prop>
        </props>
    </property>
    <property name="annotatedClasses">
        <list>
            <value>za.co.xxxx.traintrack.server.model.Answer</value>
            <value>za.co.xxxx.traintrack.server.model.Company</value>
            <value>za.co.xxxx.traintrack.server.model.CompanyRegion</value>
            <value>za.co.xxxx.traintrack.server.model.Merchant</value>
            <value>za.co.xxxx.traintrack.server.model.Module</value>
            <value>za.co.xxxx.traintrack.server.model.Question</value>
            <value>za.co.xxxx.traintrack.server.model.User</value>
            <value>za.co.xxxx.traintrack.server.model.CompletedModule</value>
        </list>
    </property>
</bean>

<bean id="dao" class="za.co.xxxx.traintrack.server.DAO">
    <property name="sessionFactory" ref="sessionFactory"/>
    <property name="adminUsername" value="${admin.user.name}"/>
    <property name="adminPassword" value="${admin.user.password}"/>
    <property name="godUsername" value="${god.user.name}"/>
    <property name="godPassword" value="${god.user.password}"/>
</bean>

第二天之前一切正常:

INFO   | jvm 1    | 2010/06/15 14:42:27 | 2010-06-15 18:42:27,804 WARN 
[JDBCExceptionReporter] : SQL Error: 0, SQLState: 08S01
INFO   | jvm 1    | 2010/06/15 14:42:27 | 2010-06-15 18:42:27,821 ERROR 
[JDBCExceptionReporter] : The last packet successfully received from the server 
was 38729 seconds ago.The last packet sent successfully to the server was 38729
seconds ago, which  is longer than the server configured value of 'wait_timeout'.
You should consider either expiring and/or testing connection validity before 
use in your application, increasing the server configured values for client
timeouts, or using the Connector/J connection property 'autoReconnect=true' to
avoid this problem.
INFO   | jvm 1    | 2010/06/15 14:42:27 | Jun 15, 2010 6:42:27 PM 
org.apache.catalina.core.ApplicationContext log
INFO   | jvm 1    | 2010/06/15 14:42:27 | SEVERE: Exception while dispatching
incoming RPC call

我已经阅读了很多不同的东西(没有一个有用),请帮助

【问题讨论】:

  • 您尝试了哪些方法?错误消息本身就是完整的答案。
  • 但是为什么hibernate.c3p0.idle_test_period 似乎被忽略了?此跟踪是由使用 C3P0 的代码生成的吗?
  • 您的错误消息表明数据库服务器在 11 小时 内无法访问。你真的确定你在晚上有网络连接吗?
  • @Kilian 我也遇到过类似的问题,每天都必须重新启动 jboss,并且应用程序一直在正常使用。会看这个。
  • Killian,与其说是无法访问数据库,不如说是 11 小时没有请求连接(因此,如果您一天不使用该应用程序,那您就完蛋了)。如果我反弹服务器并有效地在池中创建新连接,只要我一天不离开它,该应用程序就可以正常工作

标签: java hibernate spring jdbc c3p0


【解决方案1】:

看这个链接http://www.databasesandlife.com/automatic-reconnect-from-hibernate-to-mysql/

 In “hibernate.cfg.xml”:

<!-- hibernate.cfg.xml -->
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">20</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.max_statements">50</property>
<property name="connection.provider_class">
   org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- no "connection.pool_size" entry! -->

然后创建一个文件“c3p0.properties”,该文件必须位于类路径的根目录中(即无法为应用程序的特定部分覆盖它):

# c3p0.properties
c3p0.testConnectionOnCheckout=true

【讨论】:

  • Romain,我上周找到了这篇文章并尝试了c3p0.properties文件没有运气,但我没有添加connection.provider_class属性,所以我今晚重试
  • @Clinton Bosch 让我们知道它是如何工作的。还要确保放置帖子中指定的确切属性。如果它有效,您可以稍后进行调整。
  • Romain,很遗憾这对我不起作用,连接仍然超时。
  • @Clinton 你能发布你的 hibernate.cfg.xml、c3p0.properties 和 applicationContext.xml 还有任何更新的堆栈跟踪
【解决方案2】:

罗曼,我没有hibernate.cfg.xml(全部在applicationContext.XML中完成)

c3p0.properties

c3p0.testConnectionOnCheckout=true

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
           ">

    <context:annotation-config/>

    <context:component-scan base-package="za.co.cmsoftware.traintrack.server"/>

    <!-- Application properties -->
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>file:${user.dir}/@propertiesFile@</value>
            </list>
        </property>
    </bean>

    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${connection.dialect}</prop>
                <prop key="hibernate.connection.username">${connection.username}</prop>
                <prop key="hibernate.connection.password">${connection.password}</prop>
                <prop key="hibernate.connection.url">${connection.url}</prop>
                <prop key="hibernate.connection.driver_class">${connection.driver.class}</prop>
                <prop key="hibernate.show_sql">${show.sql}</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.c3p0.min_size">5</prop>
                <prop key="hibernate.c3p0.max_size">20</prop>
                <prop key="hibernate.c3p0.timeout">1800</prop>
                <prop key="hibernate.c3p0.max_statements">50</prop>
                <prop key="hibernate.c3p0.idle_test_period">300</prop>
                <prop key="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop>
            </props>
        </property>
        <property name="annotatedClasses">
            <list>
                <value>za.co.xxxx.traintrack.server.model.Answer</value>
                <value>za.co.xxxx.traintrack.server.model.Company</value>
                <value>za.co.xxxx.traintrack.server.model.CompanyRegion</value>
                <value>za.co.xxxx.traintrack.server.model.Merchant</value>
                <value>za.co.xxxx.traintrack.server.model.Module</value>
                <value>za.co.xxxx.traintrack.server.model.Question</value>
                <value>za.co.xxxx.traintrack.server.model.User</value>
                <value>za.co.xxxx.traintrack.server.model.CompletedModule</value>
            </list>
        </property>
    </bean>

    <bean id="dao" class="za.co.xxxx.traintrack.server.DAO">
        <property name="sessionFactory" ref="sessionFactory"/>
        <property name="adminUsername" value="${admin.user.name}"/>
        <property name="adminPassword" value="${admin.user.password}"/>
        <property name="godUsername" value="${god.user.name}"/>
        <property name="godPassword" value="${god.user.password}"/>
    </bean>

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

    <!-- enable the configuration of transactional behavior based on annotations -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-19
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多