2012-09-18 4 views
0

우리는 Hibernate와 many-to-many 관계를 사용하는 엔터프라이즈 애플리케이션을 조인 테이블로 작업하고 있습니다. 우리는 재현 할 수없는 대량 생산의 산발적 인 데이터베이스 교착 상태를 목격하고 있습니다.최대 절전 모드에서 교착 상태가 발생했습니다.

Category.java

public class Category { 
    .... 
    private Set<Product> products = new HashSet<Product>(); 
    ... 
} 

Category.hbm.xml

<class 
    name="Category" 
    table="CATEGORY" 
> 
    ... 
    <!-- uni-directional many-to-many association to Product --> 
    <set 
     name="products" 
     table="CATEGORY_PRODUCT_ASSC" 
     lazy="false" 
     cascade="none" 
    > 
     <key column="CATEGORY_ID" /> 
     <many-to-many class="Product" column="PRODUCT_ID" /> 
    </set> 
</class> 

Product.java, Product.hbm.xml는 같은 카테고리의 세트가 없습니다 이것은 일방적 인 다 대다이다.

CATEGORY_PRODUCT_ASSC 테이블은 CATEGORY_IDPRODUCT_ID의 두 열만있는 간단한 조인 테이블입니다. 지금

, 우리는 (카테고리에 변경 아무것도)을 CATEGORY_PRODUCT_ASSC 조인 테이블의 삽입을지고의 목적 나 최대 절전 모드 show_sql를 켜고 다음을 참조

의 카테고리 인스턴스 객체에 Session.saveOrUpdate을 요구하고있다 :

update CATEGORY set NAME=?, DESCRIPTION=?, where category_id=? 
insert into CATEGORY_PRODUCT_ASSC (CATEGORY_ID, PRODUCT_ID) values (?, ?) 

문제

는 우리가 여러 서버에서 동일한 초에서 생성되는 많은 제품, 같은 범주에 대한 모든 것을 가지고있다.

교착 상태가 표시되면 update CATEGORY 호출이 필연적으로 발생합니다. 이 update CATEGORY SQL 문이 실행되지 않도록해야합니다.

옵션 1 : Session.saveOrUpdate (category)를 호출하고 카테고리를 변경하지 않았습니까 (변경되지 않았으므로). 그러나 CATEGORY_PRODUCT_ASSC 조인 테이블에 여전히 삽입합니까?

옵션 2 : 그렇지 않은 경우 JDBC를 통해 CATEGORY_PRODUCT_ASSC 행의 직선 INSERT를 수행하는 것에 대해 생각해 보았습니다. 그러나 한 가지 관심사는 캐시에있는 오래된 Hibernate 객체 (Category 객체)이다. 이 가능한 접근법에 대한 아이디어/권장 사항은 무엇입니까?

도움을 주셔서 대단히 감사합니다. :-)

+0

최대 절전 모드 상태에서 트랜잭션을 사용하고 있습니까? 'update category' 호출이 교착 상태를 일으키는 것을 어떻게 알 수 있습니까? 이것은 급한 결론처럼 들립니다. –

+0

@matt 예, 우리는 트랜잭션을 사용하고 있습니다.제발 믿어주세요, 그것은 성급한 결론은 아니지만 "우리는 몇 주 동안이 문제로 어려움을 겪어 왔습니다. 결정적인 것은 없습니다. 이것이 우리의 최고의 리드입니다." 불행히도'update category' 호출로 교착 상태가 발생하는지 확신 할 수 없습니다. 우리는 예외를 잡아서 롤백을 설정합니다. 우리는 여러 웹 서버와 서비스 서버를 가지고 있으며 JMS 대기열과 주제를 통해 앞뒤로 의사 소통합니다. DBA는 데드락을 유발 한 실제 SQL 문을 가져올 수 없으며 차단 된 다른 SQL 문만 가져올 수 있습니다. 그들은이 업데이트 성명서를보고했습니다. –

+0

어떤 데이터베이스를 사용하고 있습니까? 어떤 객체가 차단 된 SQL 문을 기다리고 있습니까? –

답변

0

이 문제가 해결되었습니다. 그것은 update category 성명으로 밝혀졌습니다. CATEGORY_PRODUCT_ASSC 테이블을 many-to-many 관계에 대한 join-through로 사용하는 대신,이 join 테이블을 나타내는 Hibernate 관리 엔티티를 생성했습니다 ... CategoryProductAssc.

이 방법은, 우리는 직접 아무것도 카테고리 오브젝트에 변경하지 않을 때 테이블을 조인 CATEGORY_PRODUCT_ASSC의 삽입을 얻기위한 목적으로 범주 인스턴스 객체에 Session.saveOrUpdate를 호출 할 필요없이 관계를 지속 할 수있다.

20 개의 동시 실행을 실행하고 이전 코드와 새 코드를 테스트 한 결과 DBA가 이전 코드와의 동시성 및 새 코드와의 동시성을 보지 못한 Cactus 테스트를 만들었습니다.

관련 문제