2013-01-09 19 views
9

हम अपने आवेदन के लिए वसंत, हाइबरनेट और माइस्क्ल का उपयोग करते हैं। लेकिन कभी कभी एक प्रश्न उत्पन्न करता CannotAcquireLockException, नीचे दिए गए कोडकैनोटएक्वायर लॉकएक्सप्शन (स्प्रिंग, हाइबरनेट, माइस्क्ल)

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; 
    } 

}

हाइबरनेट मानचित्रण प्रकार है:

<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 

दूसरी सिफारिश समाधान COLUMNS कि WHERE खंड में इस्तेमाल किया जा रहा है, ताकि डेटाबेस अब ROW ताला लेकिन अब सूचकांक के लॉक कुंजी हैं उस पर एक सूचकांक बनाने के लिए किया गया था।

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 के लेख में यादों की एक सूची भी है, इसलिए मैं उन्हें दोहराने नहीं जा रहा हूं। बस ध्यान रखें कि डेडलॉक्स एक घातक त्रुटि नहीं है जिसे आपको इसे संभालने की आवश्यकता है। तो शायद अपवाद पकड़ो और लेनदेन का पुनः प्रयास करें। यह भी सुनिश्चित करें कि हाइबरनेट द्वारा उत्पन्न किए गए आपके प्रश्न इस अर्थ में इष्टतम हैं कि वे इंडेक्स का उपयोग कर रहे हैं, जहां वे आदि कर सकते हैं। एक और चीज जिसे आप कोशिश कर सकते हैं, हाइबरनेट पर बैचिंग और बैच में निष्पादन करना है।

मुझे यकीन है कि आप ऊपर दिए गए दो लिंक के साथ समस्या को संभालने में सक्षम होंगे और यह आपके लिए काम करने के लिए मूल्यवान अनुभव होगा। यदि आपको कोई विशेष वस्तु मिलती है तो आपको समस्या में जोड़ने के साथ समस्याएं होती हैं और इससे निपटने की सुविधा मिलती है।

संबंधित मुद्दे