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
을 사용할 때 고려해야 할 단점은 무엇입니까?
감사합니다.
좋은 점. 데이터베이스는 애플리케이션의 Java 코드에 의해서만 액세스되고 업데이트됩니다. 이 상황은 변하지 않을 것입니다. 따라서 ON DELETE CASCADE를 삭제해도 다른 응용 프로그램/스크립트/etc에 영향을 미치지 않습니다. –
그런 다음 최대 절전 모드로 진행하십시오. – bwawok
최대 절전 모드 삭제 캐스케이드와 함께 데이터베이스를 'ON DELET CASCADE'로 두지 않는 이유는 무엇입니까? 데이터베이스는 그것을 삭제하고, 최대 절전 모드는 연속 된 자식을 지우려고하지만 삭제할 것은 아무것도 없다. 그래서 아무 일도 일어나지 않거나 틀렸어? – djmj