2016-07-18 2 views
0

을 생성 나는 일 서블릿 반환/고유 한 문자열

  1. 사용자 요청이 서비스는 서블릿이 생성 된 적이없는 독특한 5 편지 문자열을 생성

    다음 않는 서블릿 서비스를 확인해야합니다. 사용자가이를 받아들이는 경우 (0 ~ 9의 조합과 ~의 Z)

  2. , 상품 튀어 기본 키

우선으로 (# 1이 생성하는) 고유의 문자열을 사용하여 사용자의 정보를 저장 내 머리가 서블릿을 공격 요청으로 1 씩 증가하는 정적 클래스 변수를 사용했지만, 여기와 구글 검색은 여러 사용자가 동시에 서비스를 히트 한 것처럼 정말 나쁜 생각이라고 말합니다 ...

그리고 지금 나는 무엇을 조사해야하는지 우둔합니다.

순차적으로 고유 한 문자열을 생성하는 가장 안전하고 안전한 방법은 무엇입니까?

답변

1

더 테이블의 필드 순서를 추가 및 새로운 요청은 데이터베이스에서 가장 높은 일련 번호를 가져온 다음 하나의 예에 1을 더한 추가하고 this site에 따르면, 가장 높은 번호 (ZZZZZ) 인

+0

하나로서 어떤 숫자가 해결 되었습니까? –

+0

여러 명의 사용자가 동시에 요청할 경우에도 동일한 문제가 발생하지 않습니까? 마찬가지로, 테이블에 더 높은 증가 시퀀스를 처리하고 저장하기 전에 2 명 이상의 사용자가 요청에 도달하면 어떻게됩니까? – RedA

+0

@JoopEggen이 솔루션으로 위의 문제를 피하는 방법에 대해 좀 더 자세히 설명해 주시겠습니까? 여러 사용자가 동시에 요청할 때? 미리 대단히 감사하겠습니다. – RedA

0

저장할 때 이제까지 426088025. 데이터베이스 세계에서는 시퀀스를 사용하고 싶지만 5 자 제한 때문에이 수가 넘지 않도록해야합니다 (잘하면 426M 미만의 레코드를 저장하는 것이 좋습니다). 데이터베이스가 다를 수 있습니다 - PostgreSQL의 구문입니다

create sequence your_sequence maxvalue 426088025 no cycle 

:

당신이 뭔가를 할 수 있습니다 시퀀스를 만듭니다.

그런 다음 코드에서 당신은 당신의 가치를 얻을 수있는

select nextval('your_sequence') 

을 할 수있는 다음 Base64로이 값을 인코딩합니다. PostgreSQL에서 "no cycle"은 최대 값에 도달하면 오류가 발생 함을 의미합니다.

자바 8에서, Base64로가 포함되어 있습니다 :

import java.util.Base64; 

... 

String userNumber = Base64.getEncoder().encodeToString(Integer.toString(integerFromSequenceSelect)); 

그렇지 않으면 당신은 자바의 이전 버전과 붙어 있다면, Apache Commons Codec를 사용하고 실행도 알고 싶어

import org.apache.commons.codec.binary.Base64; 

... 

String userNumber = Base64.encodeBase64String(Integer.toString(integerFromSequenceSelect));