一段时间后数据库连接丢失

时间:2014-12-25 05:36:29

标签: java mysql hibernate tomcat

我开发了一个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>

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

3 个答案:

答案 0 :(得分:3)

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

<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>

答案 1 :(得分:1)

我遇到了与tomcat配置池和mysql相同的问题。

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

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

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

[mysqld]
wait_timeout = xxx
interactive_timeout = xxx

在我的情况下解决此问题的最佳方法是更改​​tomcat中的配置池参数(/etc/tomcat7/context.xml)my.cnf中没有更改,并且app中没有配置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"/>

答案 2 :(得分:0)

你也可以试试这个

<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>