2013-07-02 94 views
0

我有我的春天應用程序中的一個要求,其中一個方法接收併發請求批量插入10000-50000行之間的每個行到表A(和另一個表B有外鍵引用A) 。我正在使用Hibernate的相同。處理時,我得到「鎖超時超時」異常。已經搜索了很多,但無法弄清楚如何解決這個問題。臥底數據庫是MySQL.I已附加下面的代碼相同,請幫助。超出鎖定等待超時;嘗試在spring_Hibernate_Mysql重新啓動事務

SessionFactory sessionFactory = hibernateTemplate.getSessionFactory(); 
     Session session = sessionFactory.openSession(); 
     Transaction transaction = null; 
     try { 
      transaction = session.beginTransaction(); 
      for (i = 0; i < 50000 , i++) { 
       a = new A(); 
       session.save(a); 
       recordCounter++; 
       if ((recordCounter % 20) == 0) { 
        session.flush(); 
        session.clear(); 
       } 
       if (list != null && !list.isEmpty()) { 
        for (Object object : list) { 
         b = new B(); 
    //Setters 
         b.setA(a); 
         session.save(b); 
         dataCounter++; 
         if ((dataCounter % 20) == 0) { 
          session.flush(); 
          session.clear(); 
         } 
        } 
       } 
      } 
      transaction.commit(); 
     } catch (Exception he) { 
      LOGGER.error("Exception - ", he); 
      transaction.rollback(); 
      throw he; 

     } finally { 
      if (session != null && session.isOpen()) { 
       session.close(); 
      } 
     } 

日誌: -

2013-07-02 12:41:46,932 [addVersionToFullData] ERROR QueueHelper - Exception - 
     org.hibernate.exception.GenericJDBCException: could not insert: [A] 
     at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103) 
     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91) 
     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
     at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:40) 
     at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2158) 
     at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2638) 
     at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:48) 
     at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:250) 
     at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:298) 
     at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181) 
     at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:107) 
     at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187) 
     at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33) 
     at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172) 
     at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27) 
     at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70) 
     at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535) 
     at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523) 
     at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519) 
     at com.manager.QueueHelper.populateSPInput(QueueHelper.java:1341) 
     at com.manager.QueueHelper.addVersionToFullData(QueueHelper.java:1202) 
     at com.manager.SyncServiceImpl.sendFullData(SyncServiceImpl.java:424) 
     at com.controller.SynchronizationController.getFullData(SynchronizationController.java:434) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at org.springframework.web.servlet.mvc.multiaction.MultiActionController.invokeNamedMethod(MultiActionController.java:471) 
     at org.springframework.web.servlet.mvc.multiaction.MultiActionController.handleRequestInternal(MultiActionController.java:408) 
     at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153) 
     at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) 
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
     at java.lang.Thread.run(Thread.java:722) 
     Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525) 
     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) 
     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) 
     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626) 
     at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2407) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2325) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2310) 
     at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:477) 
     at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:73) 
     at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:33) 
     ... 49 more 
+0

您將需要增加超時或使用小塊數據的事務。 – D3V

回答

3

問題:您有鎖定這些行這個大交易。當另一個請求出現時,它必須等待它們被解鎖。由於交易規模如此之大,它最終會等待很長時間並超時。

解決方案:如果您確實需要將整個事務處理爲原子級,那麼您需要增加在超時之前等待的時間量。如果你能堅持下去,最好把它分成更小的交易。

相關問題