2010-06-26 61 views
1

我一直有Hibernate和Mysql超時錯誤一週的麻煩。 顯然,我的Hibernate/MySQL在8小時後運行(這是Mysql中的默認超時值)之後,我有例外。我也加了c3p0。但它沒有幫助。休眠和Mysql超時問題,不適用於c3p0

請指點 謝謝你這麼多

這裏是我的Hibernate配置:

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
<!--Account MYSQL Username Info--> 
<property name="hibernate.connection.url">jdbc:mysql://localhost/reddragon_test?autoReconnect=true</property> 
<property name="hibernate.show_sql">true</property> 
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 
<property name="current_session_context_class">thread</property> 

<property name="hibernate.c3p0.acquire_increment">3</property> 
<property name="hibernate.c3p0.idle_test_period">10</property> 
<property name="hibernate.c3p0.timeout">10</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> 

這裏是跟蹤:

org.hibernate.exception.JDBCConnectionException: could not execute query 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
    at org.hibernate.loader.Loader.doList(Loader.java:2223) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 
    at org.hibernate.loader.Loader.list(Loader.java:2099) 
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569) 
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283) 
    at com.billing.dao.VmplanDAO.findByExample(VmplanDAO.java:178) 
    at com.billing.action.getVmplans.processRequest(getVmplans.java:37) 
    at com.billing.action.getVmplans.doGet(getVmplans.java:91) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:619) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 

Last packet sent to the server was 0 ms ago. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:406) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2985) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2871) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3414) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1734) 
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1885) 
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) 
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1787) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:674) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 
    at org.hibernate.loader.Loader.doList(Loader.java:2220) 
    ... 25 more 
Caused by: java.net.SocketException: Software caused connection abort: recv failed 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:129) 
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113) 
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160) 
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188) 
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2428) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2882) 
    ... 38 more 
java.lang.NullPointerException 
java.lang.NullPointerException 
    at com.billing.action.getVmplans.processRequest(getVmplans.java:38) 
    at com.billing.action.getVmplans.doGet(getVmplans.java:91) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:619) 
+0

請參閱http://stackoverflow.com/questions/730827/hibernate-c3p0-mysql-broken-pipe – nos 2010-06-26 13:27:50

+0

它仍然不起作用 – leon 2010-06-26 13:46:58

+0

設置看起來不錯。你確定Hibernate使用你期望使用的cfg文件嗎? – BalusC 2010-06-26 21:59:20

回答

1

要非常誠實有三個解決方案,以您的問題。我會解釋每一個解決方案的每個解決方案和利弊(將來到你的情況在過去的)

  1. 配置wait_time_out財產mysql的my.ini文件,以確保您的連接超時。這種方法肯定會起作用,但這不是一個好的解決方案。你會喜歡在你的應用程序而不是數據庫中處理這個事情,因爲有時候你可能沒有太多的數據庫控制權,或者某些其他應用程序可能使用同一個數據庫。

  2. 使用apache dbcp而不是c3p0。您可以在您提供數據庫名稱的服務器的context.xml中配置dbcp。這種方法可行,但這種方法的問題在於你可能計劃在將來使用JBOSS來切換到其他應用程序服務器,那樣的話,我不是apache dbcp將會起作用或者不起作用。我沒有用jboss試過,但猜測它不會。

  3. 第三種方式是你已經選擇了

你的情況,你所缺少的一個特性,那就是

<property name="connection.provider_class"> 
    org.hibernate.connection.C3P0ConnectionProvider 
</property> 

直到現在,你必須在服務器啓動過程中注意到,C3P0根本沒有初始化。那麼如果你在設置這個屬性後想着你的代碼會工作,我很遺憾地說,它不會。

這是由於春季代碼中的錯誤。您可以通過查看LocalSessionFactoryBean的源代碼來驗證這一點,它只是忽略上面設置的屬性的值,並將其設置爲LocalDataSourceConnectionProvider,並且您的c3p0從不初始化。

您可以提供LocalSessionFactoryBean的自定義實現,您可以在其中將提供程序類硬編碼爲C3P0ConnectionProvider。

現在重新啓動服務器,並注意您的c3p0已初始化,現在您可以處理c3p0的詳細信息。

問題到現在與你是c3p0永遠不會初始化,並失去了圖片。

希望這會有所幫助。