2010-05-19 2 views
3

내가 사용자에게 고유 한 양식을 제출하는 시점에와, 웹 응용 프로그램 작업입니다하는 MySQLIntegrityConstraintViolationException을 올바르게 catch하는 방법은 무엇입니까? 내가 중복 입력을 시도하고 있기 때문에

 MySQLIntegrityConstraintViolationException Duplicate entry -'username' 
for key 'PRIMARY'

나는이가 발생하는 이유 잘 알고 동일한 기본 키를 사용하여 데이터베이스에 입력하십시오. 그것이 중복 될 수 있기 때문에 나는 이것에 대해 아무런 코멘트도하지 않을 것이다.

내가 정말로 묻고있는 것은 어떻게해야 하는가입니다. 나는이 예외를 잡으려고 시도했지만 분명히 나의 경험 부족이 나를 따라 잡았다.

감사합니다.

데이터베이스의 중복 항목을 확인하는 더 나은 방법이 있습니까?

예를 들어, 중복 회원을 확인할 때 수행해야 할 작업과 일치하는 사용자 이름과 비밀번호가 있는지 데이터베이스에 대한 확인 만 수행하면됩니까?

감사

답변

1

일반적으로 프로그램 워크 플로를 제어하기위한 무거운 메커니즘이므로 예외를 throw하지 않는 것이 좋습니다. 버그 및 불규칙한 활동/상황을 추적하는 데에만 사용해야합니다. 즉, 예외를 발견하면 더 이상 로그를 남기고 다른 예외에서 예외를 래핑하고 결과적으로 일부 폴백 (fall-back) 프로그램 논리를 트리거하는 것입니다.

예외를 catch하고 올바른 사용자 이름을 확인하지 마십시오. 나는 당신이 등록 양식의 일종을 개발하는 경우이 체크를 많이 할 것 같아요 ... 거기에 일반 사용자에 대한 몇 가지 인기있는 단어가 있으며 예외와 함께 구현하면, 당신은 꽤 자주 잡을 것입니다 ...

데이터베이스가 매우 큰 경우 불행히도 기본 키는 많은 수의 복잡한 개체입니다. 중복 항목에 대해이 검사를 수행하기 위해 일부 요소를 메모리에 유지할 수없는 것보다 큽니다.

1

예, 특히이 시나리오에서 다른 사용자가 사용자를 삽입하려고 전에 동일한 사용자 이름 존재 여부를 확인하는 것이 좋습니다.

+0

메모리에 사용자 이름이 모두 없다고 가정하면 레코드를 삽입하기 전에 ID가 있는지 확인하는 것이 더 좋을까요? 가끔씩 예외 대신 삽입 할 때마다 데이터베이스 조회가 발생하게됩니다. –

+0

일반적으로 해당 필드에 색인이 있으므로 조회가 매우 빠릅니다. – Bozho

+1

그러나 여전히 네트워크에서 왕복이 필요합니다. Exception보다 느린 속도입니다. –

0

또한 동일한 문제가 발생하여 catch (MySQLIntegrityConstraintViolationException sql)으로 예외를 처리하십시오. 두 가지 유형의 MySQLIntegrityConstraintViolationException이 있다는 것을 잊지 마십시오. 하나는 JDBC 용이고 다른 하나는 JDBC4 용입니다. 그래서 두 개의 별도 try try 루프에서 catch하는 것이 좋습니다.

관련 문제