문제

이것은 특정 버전입니다 이 질문.
중복 행을 삽입하고 있는지 확인하고 싶습니다. 응용 프로그램 계층에서 프로그래밍 방식으로 확인해야합니다.

if (exists(obj))
{
    throw new DuplicateObjectException();
}
HibernateSessionFactory.getSession().save(obj);

아니면 데이터베이스 계층에서 던져진 예외를 포착하고 기부금을 위반할 때 트리거되어야합니까?

try
{
    HibernateSessionFactory.getSession().save(obj);
}
catch(ConstraintViolationException e)
{
    throw new DuplicateObjectException();
}

편집하다: 다시 말해서 : 제약 조건이 남아 있어야하지만 (어쨌든 좋은 데이터베이스 디자인이며, 내 앱이 테이블에 액세스하는 유일한 앱이 될 것이라고 확신 할 수는 없습니다) 제약 조건에 의존하고 위반이 제기 될 예외를 처리해야합니다. , 아니면 어쨌든 더 잘 확인 하시겠습니까?

edit2 : 물론 트랜잭션 내에서 확인+삽입을하고 테이블을 잠그면 다른 프로세스가 다른 레코드를 작성하지 않도록합니다.

도움이 되었습니까?

해결책

너 먼저 ~ 해야 하다 데이터베이스에 기본 키나 고유 한 제약 조건을 사용하여 이러한 독창성을 올바르게 시행 할 수 있습니다.

제약이 존재한다는 점을 감안할 때 응용 프로그램에서 어떤 방법으로 코딩해야합니까? 내가 선호하는 것은 인서트를 시도하고 예외를 포착하는 것입니다. 아마도 대부분의 인서트가 성공할 것이기 때문에, 중복 으로서는 몇 가지만 실패 할 것입니다 (즉, "예외"가 암시하는 것입니다!) : 데이터베이스가 어쨌든 자체 제약 조건을 확인할 때 모든 삽입 전에 존재 검사를 수행하는 것은 비효율적입니다.

또한, 다른 사람이 존재하는 체크와 삽입 사이의 작은 간격으로 동일한 키 값을 가진 레코드를 커밋하는 경우 다른 점검이 이론적으로 가능합니다. 그런 다음 데이터베이스 예외를 가두 지 않으면 실제로 삽입이 성공하지 못했을 때 성공했다고 생각합니다.

다른 팁

당신은 객체가 응용 프로그램 코드에만 존재하는지 확인한 다음, 일단 만족하지 않음을 만족시키고 객체를 멍청하게 저장합니다. 그러나 또 다른 동시 클라이언트는 두 줄의 코드 사이에 순간에 자신의 객체를 삽입 할 수 있습니다. 어쨌든 중복 예외가 생길 것입니다. 이번에는 잡을 수 없습니다.

저장 ()을 수행하고 예외를 포착해야합니다. 그렇지 않으면 동일한 데이터베이스에서 작업하는 다른 동시 클라이언트와 인종 조건이 있습니다.

응용 프로그램이 행을 데이터베이스에 삽입하고 행을 삽입하는 유일한 응용 프로그램이라는 것을 보장 할 수없는 한 데이터베이스 예외를 포착해야합니다.

편집하다: 나는이 질문을 오해했을지 모르지만 여전히 옵션 B (HibernatesessionFactory는 데이터베이스에서 제한 조건을 던진다)가 더 나은 옵션이라고 주장합니다. 다른 응용 프로그램이 수표와 실제 기능 호출 사이에 시간의 은색에 무언가를 삽입 할 수있는 기회가 항상 있습니다. 또한, 듀프를 확인하는 유일한 방법은 성능에 불필요한 배수구 인 추가 쿼리를 수행하는 것입니다.

이 질문에 대한 나의 원래 이해는 옵션 A에서 듀프 점검이 내부적으로 수행 될 것이라는 점입니다 (즉, 프로그램이 이미 만든 데이터 구조 만 사용하고 삽입 할 때까지 쿼리가 없음). 나의 원래 대답은이 방법에 대한 응답이었습니다.

일반적으로, 나는 뭔가 잘못했기 때문에 발생하는 오류에 의존하는 코딩을 피하려고 노력합니다. 그러나 때로는 그게 당신이 할 수있는 전부입니다. 당신의 상황에서, 나는 당신이 먼저 확인해야한다고 생각합니다.

제약 조건이 어떤 이유로 삭제되면 (일반적으로 DBA가 다시 활성화 할 수있는 유지 보수 작업)가 끊어지면 (중복 항목을 허용). 응용 프로그램 내 에서이 상황을 확인해야합니다.

그러나 다른 사람들이 데이터베이스를 사용하고 있기 때문에 데이터베이스가 제약 조건을 시행하는 것이 좋습니다. 일반화로서 애플리케이션과 데이터베이스가 M : M 관계에 살고 있다고 가정하는 것이 가장 좋습니다. 이것은 거의 모든 시간이 될 것입니다.

최대 절전 모드 (또는 ORM 구성 요소)에 의해 던져진 예외는 해석하기 어려운 경향이 있습니다.

예외에 실제로 사용자에게 도움이되는 오류 메시지를 생성 할 수있는 충분한 정보가 있으면 예외를 포착하고 분석 한 후 계속 진행하십시오.

예외에 정보가 충분하지 않은 경우 오류 조건을 확인하고 사용자에게 문제가있는 경우 유용한 오류 메시지를 생성해야합니다.

문제는 "어떻게 불투명 한 예외"중 하나입니까? 일부는 꽤 불투명합니다. 다른 사람들은 메시지 문자열을 구문 분석하고 사용자에게 무엇을 말할지 알아낼 수있을 정도로 충분합니다.

일단 최대 절전 모드가 세션에서 예외를 던집니다 세션을 폐기해야합니다 (섹션 11.2.3 참조). 따라서 DUPS를 확인하고 동일한 세션을 계속 사용해야하는 경우 응용 프로그램에서 먼저 확인하는 것 외에는 선택의 여지가 없습니다.

또한 첫 번째 스 니펫의 코드에는 다른 프로세스가 중복 레코드를 확인한 시간과 실제로 삽입되는 시간 사이에 중복 예외가 발생하는 레코드를 삽입 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top