2013-01-09 24 views
9

我們在我們的應用程序中使用spring,hibernate和mysql。但有時查詢生成CannotAcquireLockException,代碼如下CannotAcquireLockException(Spring,Hibernate,Mysql)

public Ledger[] storeOrUpdateLedgers(Ledger[] ledgers,int iClinicId) throws DataAccessException{ 

    List<Ledger> ledgerList = new ArrayList<Ledger>(); 
    for(int i=0;i<ledgers.length;i++){ 
     ledgers[i].setiClinicId(iClinicId); 
     ledgerList.add(ledgers[i]); 
    } 

    for(int i=0;i<ledgerList.size();i++){ 
     getHibernateTemplate().clear(); 
     getHibernateTemplate().saveOrUpdate(ledgerList.get(i)); 
     getHibernateTemplate().flush(); 
    } 
} 
public class Ledger implements Serializable { 

    private int iLedgerId; 
    private int iClinicId; 
    private int iPatientId; 
    private int iProviderId; 
    private int iVisitId; 
    private int iPaymentId; 
    private int iClaimId; 
    private int iProcedureId; 
    private String sDate; 
    private double dAmount; 
    private byte btType; 
    private String sDesc; 
    private byte btCurrParty; 
    private int iCurrPartyId; 
    private byte btRespParty; 
    private int iRespPartyId; 
    private boolean active; 
    private int iParentId; 
    private int iReasonId; 
    private String sDos; 
    private int iU_ID; 
    private String sEntryDate; //no mapping required 


    public int getiU_ID() { 
    return iU_ID; 
    } 

    public void setiU_ID(int iUID) { 
    iU_ID = iUID; 
    } 

    public int getiLedgerId() { 
    return iLedgerId; 
    } 

    public void setiLedgerId(int iLedgerId) { 
    this.iLedgerId = iLedgerId; 
    } 

    public int getiClinicId() { 
    return iClinicId; 
    } 

    public void setiClinicId(int iClinicId) { 
    this.iClinicId = iClinicId; 
    } 

    public int getiPatientId() { 
    return iPatientId; 
    } 

    public void setiPatientId(int iPatientId) { 
    this.iPatientId = iPatientId; 
    } 

    public int getiProviderId() { 
    return iProviderId; 
    } 

    public void setiProviderId(int iProviderId) { 
    this.iProviderId = iProviderId; 
    } 

    public int getiVisitId() { 
    return iVisitId; 
    } 

    public void setiVisitId(int iVisitId) { 
    this.iVisitId = iVisitId; 
    } 

    public int getiPaymentId() { 
    return iPaymentId; 
    } 

    public void setiPaymentId(int iPaymentId) { 
    this.iPaymentId = iPaymentId; 
    } 

    public int getiClaimId() { 
    return iClaimId; 
    } 

    public void setiClaimId(int iClaimId) { 
    this.iClaimId = iClaimId; 
    } 

    public int getiProcedureId() { 
    return iProcedureId; 
    } 

    public void setiProcedureId(int iProcedureId) { 
    this.iProcedureId = iProcedureId; 
    } 

    public String getsDate() { 
    return sDate; 
    } 

    public void setsDate(String sDate) { 
    this.sDate = sDate; 
    } 

    public double getdAmount() { 
    return dAmount; 
    } 

    public void setdAmount(double dAmount) { 
    this.dAmount = dAmount; 
    } 

    public byte getbtType() { 
    return btType; 
    } 

    public void setbtType(byte btType) { 
    this.btType = btType; 
    } 

    public String getsDesc() { 
    return sDesc; 
    } 

    public void setsDesc(String sDesc) { 
    this.sDesc = sDesc; 
    } 

    public byte getbtCurrParty() { 
    return btCurrParty; 
    } 

    public void setbtCurrParty(byte btCurrParty) { 
    this.btCurrParty = btCurrParty; 
    } 

    public int getiCurrPartyId() { 
    return iCurrPartyId; 
    } 

    public void setiCurrPartyId(int iCurrPartyId) { 
    this.iCurrPartyId = iCurrPartyId; 
    } 

    public byte getbtRespParty() { 
    return btRespParty; 
    } 

    public void setbtRespParty(byte btRespParty) { 
    this.btRespParty = btRespParty; 
    } 

    public int getiRespPartyId() { 
    return iRespPartyId; 
    } 

    public void setiRespPartyId(int iRespPartyId) { 
    this.iRespPartyId = iRespPartyId; 
    } 

    public boolean isActive() { 
    return active; 
    } 

    public void setActive(boolean active) { 
    this.active = active; 
    } 

    public int getiParentId() { 
    return iParentId; 
    } 

    public void setiParentId(int iParentId) { 
    this.iParentId = iParentId; 
    } 

    public int getiReasonId() { 
    return iReasonId; 
    } 

    public void setiReasonId(int iReasonId) { 
    this.iReasonId = iReasonId; 
    } 

    public String getsDos() { 
    return sDos; 
    } 

    public void setsDos(String sDos) { 
    this.sDos = sDos; 
    } 

    public String getsEntryDate() { 
    return sEntryDate; 
    } 

    public void setsEntryDate(String sEntryDate) { 
    this.sEntryDate = sEntryDate; 
    } 

}

hibernate映射:

<class name="com.iris.allofactor.data.vo.Ledger" table="LEDGER"> 
    <id name="iLedgerId" column="LEDGER_ID" unsaved-value="0"> 
     <generator class="native"/> 
    </id> 
    <property name="iClinicId" column="CLINIC_ID"></property> 
    <property name="iPatientId" column="PATIENT_ID"></property> 
    <property name="iProviderId" column="PROVIDER_ID"></property> 
    <property name="iVisitId" column="VISIT_ID"></property> 
    <property name="iPaymentId" column="PAYMENT_ID"></property> 
    <property name="iClaimId" column="CLAIM_ID"></property> 
    <property name="iProcedureId" column="PROCEDURE_ID"></property> 
    <property name="sDate" column="DATE"></property> 
    <property name="dAmount" column="AMOUNT"></property> 
    <property name="btType" column="TYPE"></property> 
    <property name="sDesc" column="DESCRIPTION"></property> 
    <property name="btCurrParty" column="CURR_PARTY"></property> 
    <property name="iCurrPartyId" column="CURR_PARTY_ID"></property> 
    <property name="btRespParty" column="RESP_PARTY"></property> 
    <property name="iRespPartyId" column="RESP_PARTY_ID"></property> 
    <property name="active" column="ACTIVE"></property> 
    <property name="iParentId" column="PARENT_ID"></property> 
    <property name="iReasonId" column="REASON_ID"></property> 
    <property name="sDos" column="DOS"></property> 
    <property name="iU_ID" column="USER_ID"></property> 
</class> 

堆棧跟蹤如下:

at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:244) 
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 
at org.springframework.orm.hibernate3.HibernateAccessor.convertJdbcAccessException(HibernateAccessor.java:424) 
at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:410) 
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424) 
at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
at org.springframework.orm.hibernate3.HibernateTemplate.flush(HibernateTemplate.java:890) 
at com.iris.allofactor.data.dao.hibernate.HibernateLedgerDao.storeOrUpdateLedgers(HibernateLedgerDao.java:97) 
at com.iris.allofactor.data.dao.impl.LedgerAuditBODaoImpl.storeOrUpdateLedgers(LedgerAuditBODaoImpl.java:64) 
at com.iris.allofactor.data.dao.impl.ChargesDaoImpl.storeOrUpdateCharges(ChargesDaoImpl.java:844) 
at com.iris.allofactor.data.dao.impl.ClaimEncounterBODaoImpl.addorEditClaimWhileClaimIdAndVisitIdIsPresent(ClaimEncounterBODaoImpl.java:1072) 
at com.iris.allofactor.data.dao.impl.ClaimEncounterBODaoImpl.storeOrUpdateClaim(ClaimEncounterBODaoImpl.java:819) 
at com.iris.allofactor.data.dao.facade.DaoFacadeImpl.storeOrUpdateClaim(DaoFacadeImpl.java:1915) 
at sun.reflect.GeneratedMethodAccessor2549.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
at $Proxy2.storeOrUpdateClaim(Unknown Source) 
at com.iris.allofactor.services.impl.ClaimServiceImpl.addorEditClaim(ClaimServiceImpl.java:447) 
at com.iris.allofactor.services.soap.impl.ClaimWebServiceImpl.addorEditClaim(ClaimWebServiceImpl.java:337) 
at sun.reflect.GeneratedMethodAccessor2548.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.java:397) 
at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider.java:186) 
at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:323) 
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32) 
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118) 
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83) 
at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:453) 
at org.apache.axis.server.AxisServer.invoke(AxisServer.java:281) 
at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:699) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327) 
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.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) 

它重複地產生這個例外,我認爲我的方法存在一些麻煩。

回答

8

我想知道您的問題是否與此主題中討論的問題類似:Deadlock problems with Hibernate/Spring/MS-SQL。這個特定問題的根本原因在於你有一個線程針對數據庫執行查找/選擇,而另一個線程正試圖對數據庫執行刪除/插入操作。線程中提出了2個解決方案。

第一次優化查找和刪除代碼,以便它是一個SQL命令而不是兩個。

# sql sudo code 

# original query 
find me this row where this=that 
delete this row 

# better query 
delete this row where this=that 

第二種推薦的解決方案是建立在那些在WHERE子句中使用,使數據庫不再鎖定ROW但現在會鎖定索引鍵的COLUMNS的索引。

11

這是一個確定的死鎖情況。這與MySQL錯誤相關,而不是與類的休眠問題相關。首先讓我們回顧一下死鎖的定義:死鎖是兩個或更多的競爭行爲都等待另一個完成的情況,因此從來都沒有。請參閱此頁以獲取更多信息:http://en.wikipedia.org/wiki/Deadlock

您如何處理這種情況。那麼你需要閱讀以下文章:http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html這包含你需要的大部分信息。本文詳細解釋瞭如何跟蹤和處理它必須閱讀的死鎖。

基本上你需要做基於上述信息如下步驟:

  1. 創建MySQL的跟蹤:跟蹤被MySQL服務器上運行的所有查詢。
  2. 獲取死鎖跟蹤信息
  3. 將死鎖跟蹤和MySQL跟蹤相互匹配以確定死鎖的原因。

innodb's上的文章有一個記憶列表,所以我不打算在這裏重申。請記住,死鎖不是您需要處理的致命錯誤。所以也許趕上例外並重試交易。還要確保你的查詢是由hibernate生成的,因爲他們正在使用索引,他們可以等等。你可以嘗試的另一件事是在hibernate上批處理事務並批量執行。

我確信上述兩條鏈接,您將能夠處理該問題,這對您自己完成這項工作將是寶貴的經驗。如果您發現有問題的任何特定項目,請將其添加到問題中並讓它處理。

相關問題