우리는 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_ID
및 PRODUCT_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 객체)이다. 이 가능한 접근법에 대한 아이디어/권장 사항은 무엇입니까?
도움을 주셔서 대단히 감사합니다. :-)
최대 절전 모드 상태에서 트랜잭션을 사용하고 있습니까? 'update category' 호출이 교착 상태를 일으키는 것을 어떻게 알 수 있습니까? 이것은 급한 결론처럼 들립니다. –
@matt 예, 우리는 트랜잭션을 사용하고 있습니다.제발 믿어주세요, 그것은 성급한 결론은 아니지만 "우리는 몇 주 동안이 문제로 어려움을 겪어 왔습니다. 결정적인 것은 없습니다. 이것이 우리의 최고의 리드입니다." 불행히도'update category' 호출로 교착 상태가 발생하는지 확신 할 수 없습니다. 우리는 예외를 잡아서 롤백을 설정합니다. 우리는 여러 웹 서버와 서비스 서버를 가지고 있으며 JMS 대기열과 주제를 통해 앞뒤로 의사 소통합니다. DBA는 데드락을 유발 한 실제 SQL 문을 가져올 수 없으며 차단 된 다른 SQL 문만 가져올 수 있습니다. 그들은이 업데이트 성명서를보고했습니다. –
어떤 데이터베이스를 사용하고 있습니까? 어떤 객체가 차단 된 SQL 문을 기다리고 있습니까? –