2010-06-26 85 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永远不会初始化,并失去了图片。

希望这会有所帮助。