2013-01-09 24 views
9

私たちのアプリケーションにはspring、hibernate、およびmysqlを使用します。時々クエリはCannotAcquireLockExceptionが発生しかし、コードは、Hibernateマッピング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; 
    } 

以下の通りである:

<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つのソリューションがありました。

最初に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 

秒推奨ソリューション

は、データベースがもはや ROWをロックしていないが、今のインデックスのキーをロックなるように WHERE句で使用されている COLUMNSにインデックスを作成することでした。

11

これは明確なデッドロック状況です。これは、あなたのクラスでの休止状態の問題よりMySQLエラーに関連しています。まず、デッドロックの定義を確認します。デッドロックとは、2つ以上の競合するアクションがそれぞれ他のアクションを完了するのを待っている状態であり、これも実行されません。詳細については、このページを参照してください。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の記事には覚え書きのリストもありますので、ここでは繰り返しません。デッドロックが致命的なエラーではないことを心に留めておいてください。だから、例外をキャッチしてトランザクションを再試行してください。また、hibernateによって生成されたクエリが、インデックスなどを使用しているという意味で最適であることを確認してください。もう1つのことは、トランザクションをバウンダリして、hibernateでバッチ処理を実行することです。

上記の2つのリンクが問題を処理できると確信しており、これを自分で処理することは貴重な経験となります。特定のアイテムを見つけたら問題がある場合は質問に追加し、それに対処してください。

関連する問題