2017-10-16 2 views
0

엔티티에 대한 고유 ID를 생성하고 엔티티를 카산드라 데이터베이스에 저장하고자합니다 (생성 된 ID가있는 엔티티가 이미 존재하지 않는 경우에만).생성 된 ID가 데이터베이스에 존재하지 않도록하는 방법

id 생성 후 동일한 ID를 가진 엔티티가 있으면 db를 체크인합니다. 그렇지 않으면 엔티티가 저장됩니다. 이면 MyService 클래스의 샘플 코드 : MyDao에서

synchronized (MyService.class) { 
    do { 
     id = generateId(); 
    } while (myDao.find(id) != null); 
    sampleObject.setId(id); 
    myDao.create(sampleObject); 
} 

내가 사용하고 개체를 저장 :

cassandraOperations.insert(sampleObject); 

이미 생성 된 ID가 데이터베이스에 존재하지 않음을 보장하는 가장 좋은 방법은 무엇입니까? 이 동기화 블록이 가장 효율적인 솔루션이 아니라고 생각합니다. 또는 데이터베이스에 동일한 ID를 가진 엔티티가없는 경우에만 엔티티가 삽입되도록하는 다른 방법이 있습니까?

+0

확인 [이] (https://stackoverflow.com/questions/3935915/how-to-create-auto-increment-ids- in-cassandra) – Russiancold

+0

uuid를 id로 사용합니까? 그렇다면 충돌 가능성은 0입니다. 따라서 존재 여부를 확인할 필요조차 없습니다. – rvit34

+0

제 경우에는 ID가 영숫자 문자열입니다. UUID를 사용하더라도 매우 낮은 충돌 진행 가능성이 있습니다. –

답변

6

유형 1uuids (timeuuid)는 밀리 초당 (호스트 당) 10kuu 미만을 만들면 충돌을 방지합니다. 따라서 처리량이나 대기 시간에 영향을주지 않는 가장 쉬운 솔루션입니다. 유형 4 랜덤 uuid (uuid 유형)를 사용하는 경우 충돌 가능성은 데이터 센터 아래에서 분출하는 초고압 화산보다 적지 만 시간 보장이 보장되지는 않습니다.

가벼운 트랜잭션을 쿼리에 IF NOT EXISTS 절과 함께 사용할 수도 있습니다.

INSERT INTO keyspace_name.table_name 
    (identifier, column_name...) 
    VALUES (value, value ...) IF NOT EXISTS 

이것은 행이 아직 존재하지 않는 경우에만 변형을 적용합니다. 이 쿼리는 성공했는지 여부를 알려주는 applied 필드를 반환합니다. 삽입 된 또 다른 동일한 것만이 작동합니다.

https://docs.datastax.com/en/cql/3.1/cql/cql_reference/insert_r.html#reference_ds_gp2_1jp_xj__if-not-exists

가 완료 될 때까지 클러스터 주변에 여러 홉 소요 paxos를 사용하기 때문에이 느려집니다.

0

UUID는 안전한 솔루션이지만 때로는 id가별로 고유하지 않습니다. 예 : SSN. Cassandra는 경량 트랜잭션을 지원합니다. https://docs.datastax.com/en/cql/3.3/cql/cql_using/useInsertLWT.html

온 애플리케이션 쪽 동기화이 필요합니다. 카산드라 결과 집합은 이 적용되고 플래그가 true로 기록되면 기록됩니다.
기능 쓰기 :

ResultSet insertIfNotExists(String Id) { 
    String cql = QueryBuilder.insertInto("table_name") 
      .value("id", Id) 
      .ifNotExists() 

    return cassandraOperations.query(cql); 
} 

사용법 :

ResultSet rs = insertIfNotExists("abc123") 
if (rs.wasApplied()) { 
    log.info("success") 
} 
관련 문제