2014-12-25 134 views
0

我開發了一個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

可能通過連接超時關閉。 ü可以使用驗證查詢嘗試這樣的事:

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

你可以試試這個,以及

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

至於另外,我曾與C3P0同樣的問題,所以我swithced到org.apache.tomcat .jdbc.pool.DataSource like:

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

我和tomcat配置池和mysql有同樣的問題。

可以驗證MySQL數據庫的連接超時,經由命令:

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中的更改以及應用程序中沒有配置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"/> 
相關問題