2010-06-21 4 views
6

Java 응용 프로그램에는 데이터베이스 (SQL Server 또는 MySQL)에 매핑되는 약 100 개의 클래스가 있습니다. Hibernate를 ORM (XML 매핑 파일들)으로 사용하고 있습니다.데이터베이스 스키마에서 최대 절전 모드 2 차 캐시 및 ON DELETE CASCADE

우리는 데이터베이스 스키마에서 FOREIGN KEY 제약 조건을 지정합니다. 또한 FOREIGN KEY 제약 조건의 대부분은 ON DELETE CASCADE을 지정합니다.

우리는 최근 몇 가지 성능 문제를 완화하기 위해 Hibernate 2nd level 캐싱 (인기있는 엔터티 및 컬렉션 용)을 활성화하기 시작했습니다.

2 차 수준 캐시를 활성화 한 이후 성능이 향상되었습니다. 그러나 우리는 또한 ObjectNotFoundExceptions를 만나기 시작했습니다.

데이터베이스 테이블 행 최대 절전 모드 아래 삭제되기 때문에 ObjectNotFoundExceptions가 발생하는 것 같다. 예를 들어, 우리가 Hibernate를 가지고 Parent을 지울 때, 데이터베이스 스키마는 어떤 Child 엔티티로 ON DELETE CASCADE이 될 것이다. 이는 Hibernate에 대한 지식이 없으면 분명히 나타나므로 2 차 레벨 캐시를 업데이트 할 기회를 얻지 못하며 삭제 된 Child 엔티티를 제거 할 수 없습니다.

이 문제의 해결책은 데이터베이스 스키마에서 ON DELETE CASCADE을 제거하는 것입니다 (단, FOREIGN KEY은 그대로 유지해야합니다). 대신, Hibernate가 정상적인 삭제 SQL과 함께 Child 의존성을 지우도록 설정해야한다. 또한 Hibernate는 2 차 레벨 캐시를 갱신 할 것이다. 일부 제한된 테스트 결과이 접근법이 효과가있는 것으로 나타났습니다.

이것에 대한 커뮤니티 의견을 얻고 싶습니다. 우리 문제에 대한 대안 (더 나은?) 해결책이 있습니까? 다른 사람들이이 상황을 어떻게 처리합니까? 일반적으로 Hibernate가있는 데이터베이스 스키마에서 ON DELETE CASCADE을 사용할 때 고려해야 할 단점은 무엇입니까?

감사합니다.

답변

1

프로그램을 통해 항상 삭제하려는 경우 데이터베이스에서 제한 조건을 제거하고 최대 절전 모드 개체를 ON DELETE CASCADE에게 전달하여 관련 사용자를 돌보고 싶습니다.

반면에 Java 응용 프로그램에서 때때로 데이터베이스 수준에서 개체를 삭제하려고하면 이상한 교수형 데이터로 끝납니다. 이 경우 더 복잡한 접근법을 조사해야 할 수도 있습니다.이 경우가 명확하지 않은 경우 여기에서 자세히 설명하지 않을 것입니다.

+0

좋은 점. 데이터베이스는 애플리케이션의 Java 코드에 의해서만 액세스되고 업데이트됩니다. 이 상황은 변하지 않을 것입니다. 따라서 ON DELETE CASCADE를 삭제해도 다른 응용 프로그램/스크립트/etc에 영향을 미치지 않습니다. –

+0

그런 다음 최대 절전 모드로 진행하십시오. – bwawok

+0

최대 절전 모드 삭제 캐스케이드와 함께 데이터베이스를 'ON DELET CASCADE'로 두지 않는 이유는 무엇입니까? 데이터베이스는 그것을 삭제하고, 최대 절전 모드는 연속 된 자식을 지우려고하지만 삭제할 것은 아무것도 없다. 그래서 아무 일도 일어나지 않거나 틀렸어? – djmj

1

당신이 당신의 데이터베이스에 ON DELETE CASCADE를 사용하는 경우에는 다음과 같이 최대 절전 모드를 알려줄 필요가 :

@OnDelete(action = OnDeleteAction.CASCADE) 

이 후자는 메모리에 대한 hibenrate 뭔가를 말하고있다

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 

다른 관계. 첫 x 째는 데이터베이스 레벨에서 h 제 SQL.을 최적화합니다. Hibernate는 DB가 delete child를 처리하고 있음을 알아야한다.

은이 메커니즘의 좋은 설명이 사이트에서보세요 :

http://eddii.wordpress.com/2006/11/16/hibernate-on-deletecascade-performance/

이 기능의 개발자의 코멘트 :

http://www.mail-archive.com/[email protected]/msg03801.html

+0

두 번째 레벨 캐시가 @OnDelete에서 올바르게 작동합니까? 모두, 내가 무엇을 찾을 수 있는지 : no - http://stackoverflow.com/a/21155878/548473. – GKislin

+1

그것은 작동합니다! 그것은 캐시와 함께 작동하는데 전혀 문제가 없습니다. 그러나 언제나처럼 : 당신이하고있는 일과 최대 절전 모드가 예상하는 것을 이해해야합니다. – Janning