2011-01-08 3 views
4

나는 Hibernate를 사용하는 것을 배우고있다. 최대 절전 모드에서 병행 삽입을하는 법을 제대로 알고 싶습니다. > URL -Hibernate + concurrent inserts (MySQL INSERT IGNORE)

CREATE TABLE `urls` (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    md5 CHAR(32) UNIQUE, 
    url TEXT 
); 

테이블 목적은 매핑 ID <을 유지하는 것입니다 :

가 나는 URL을 테이블로 정의합니다. md5 필드는 url의 md5 합계입니다. 일반적으로 url은 1024 바이트보다 길 수 있습니다. 이는 mysql의 UNIQUE 제약 조건의 한도입니다.

제 질문은 url -> id 함수 처리 동시성에 대한 쿼리입니다. JDBC 구현에서는 다음 단계를 수행합니다.

  1. SELECT id WHERE md5 = md5 (url);
  2. 존재하는 경우 ID를 반환하고 그 밖의 경우 :
  3. URL을 삽입하십시오 (MD5, URL) VALUES (MD5 (url), url);
  4. 재시도 요청 된 URL이 2 단계와 내가 최대 절전 모드와 함께이 작업을 수행하려면 어떻게 (3) 사이에 삽입하는 경우에도 그것은 좋은 일 1.

단계?

답변

2

어노테이션 @SQLInsert으로 주위를 둘러 볼 수 있습니다. 삽입 중에 사용할 SQL.을 지정할 수 있습니다. 문제는 : Hibernate는 데이터베이스에서 데이터를 삽입/업데이트/선택하는 것 이상을 수행한다. 즉, 처음에는 @SQLInsert를 사용하는 것이 좋겠지 만, 당신이 묘사 한 시나리오 (2 단계와 3 단계 사이의 동시 삽입)에 충돌했을 때 Hibernate가 어떻게 동작하는지 확신 할 수 없다. 특별히 4 단계를 수행하지 않습니다. 대신 JDBC의 "getGeneratedKeys"를 호출하여 생성 된 ID를 검색합니다 (삽입이 무시 된 경우 null이됩니다).

간단히 말해서 내가 볼 수있는 유일한 해결책은 @SQLInsert를 사용하는 것입니다.하지만 동시 삽입이 발생하면 Hibernate가 올바르게 작동하는지 확인해야합니다.