【问题标题】:Database connection lost after some time一段时间后数据库连接丢失
【发布时间】:2014-12-25 05:36:29
【问题描述】:

我开发了一个Web应用程序,在这个JSF是前端,mysql是后端。我正在使用 Hibernate ORM 框架来连接数据库。我在 tomcat 中托管我的应用程序,它可以在几个小时内正常工作。一段时间后,我遇到了一些异常,例如,

Dec 25, 2014 9:50:50 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: No operations allowed after connection closed.
Dec 25, 2014 9:50:50 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 0, SQLState: 08003

之后无法从数据库中检索值。如果我重新启动我的 tomcat 意味着它可以在几个小时内正常工作。

    <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.password">*****</property>
    <property name="hibernate.connection.url">jdbc:mysql://192.168.1.253:3306/Test</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.jdbc.batch_size">30</property>
    <property name="hibernate.search.autoregister_listeners">false</property>
    <property name="hibernate.show_sql">false</property>
    <property name="hibernate.c3p0.max_size">100</property>
    <property name="hibernate.c3p0.min_size">3</property> 
    <property name="hibernate.c3p0.timeout">900</property>
    <property name="hibernate.c3p0.max_statements">100</property>

任何人都建议我解决我的错误的正确方法。

【问题讨论】:

    标签: java mysql hibernate tomcat


    【解决方案1】:

    可能连接因超时而关闭。你可以使用验证查询尝试这样的事情:

    <property name=“hibernate.c3p0.idle_test_period”>14400</property>
    <property name=“hibernate.c3p0.timeout”>25200</property>
    <property name=“hibernate.c3p0.max_size”>15</property>
    <property name=“hibernate.c3p0.min_size”>3</property>
    <property name=“hibernate.c3p0.max_statements”>0</property>
    <property name=“hibernate.c3p0.preferredTestQuery”>select 1;</property>
    

    【讨论】:

      【解决方案2】:

      tomcat 配置池和 mysql 也有同样的问题。

      您可以通过命令验证mysql db的连接超时:

      mysql> SELECT @@global.wait_timeout, @@global.interactive_timeout, @@session.wait_timeout, @@session.interactive_timeout;
      

      对于未使用的 mysql 关闭连接,默认值为 28800 秒 = 8 小时。可以在 /etc/mysql/my.cnf 中更改此值:

      [mysqld]
      wait_timeout = xxx
      interactive_timeout = xxx
      

      在我的情况下,解决这个问题的最佳方法是更改​​ tomcat (/etc/tomcat7/context.xml) 中的配置池参数,my.cnf 中没有更改,并且应用程序中没有配置 c3p0。

      <Resource name="jdbc/yourxxxbd"
      auth="Container"
      type="javax.sql.DataSource" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
      initialSize="15"
      maxActive="30"
      maxIdle="15"
      minIdle="15"
      timeBetweenEvictionRunsMillis="28700"
      minEvictableIdleTimeMillis="28750"
      validationQuery="SELECT 1"
      validationInterval="28760"
      testOnBorrow="true"
      removeAbandoned="true"
      removeAbandonedTimeout="55"
      username="youruser"
      password="yourpass"
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/yourxxxbd?allowMultiQueries=true"/>
      

      【讨论】:

        【解决方案3】:

        你也可以试试这个

        <property name="hibernate.connection.url">jdbc:mysql://192.168.1.253:3306/Test?autoReconnect=true</property>
        

        另外,我对 c3p0 也有同样的问题,所以我切换到了 org.apache.tomcat.jdbc.pool.DataSource 之类的:

         <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"
                  destroy-method="close">
                <property name="driverClassName" value="${database.driverClassName}" />
                <property name="url" value="${database.url}" />
                <property name="username" value="${database.username}" />
                <property name="password" value="${database.password}" />
                <property name="initialSize" value="5" />
                <property name="maxActive" value="30" />
                <property name="removeAbandoned" value="false" />
                <property name="testOnBorrow" value="true" />
                <property name="testOnReturn" value="true" />
                <property name="validationQuery" value="select 1" />
            </bean>
        

        【讨论】:

          猜你喜欢
          • 2020-04-07
          • 2018-10-13
          • 1970-01-01
          • 2013-04-27
          • 2022-08-23
          • 1970-01-01
          • 2012-02-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多