2014-10-16 2 views
3

yyMMddhhmmssMs로 구성되어야하는 OrderId를 생성 중이며이 orderId는 Orders 테이블의 primarykey 필드를 나타냅니다.현재 날짜를 기준으로 UniqueId를 생성하는 방법

import java.text.SimpleDateFormat; 
import java.util.Date; 

public class DateTime { 

    public static String getCurrentDateTimeMS() { 
     Date dNow = new Date(); 
     SimpleDateFormat ft = new SimpleDateFormat("yyMMddhhmmssMs"); 
     String datetime = ft.format(dNow); 
     return datetime; 
    } 

    public static void main(String args[]) throws InterruptedException { 
     for (int i = 0; i < 50; i++) { 
      String orderid = DateTime.getCurrentDateTimeMS(); 
      System.out.println(orderid); 
     } 
    } 
} 

하지만 난 그들 중 대부분은 중복을 던지고 있었다 이초의 램프 최대 100 사용자와 JMeter를 사용하여 내 응용 프로그램을 테스트로드 할 때

아래와 같이 :

내가 주문 ID를 생성 한 방법은 다음과 같습니다

java.sql.BatchUpdateException: Duplicate entry '1410160239241024' for key 'PRIMARY' 
     at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1269) 
     at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:955) 
     at com.services.OrdersInsertService.getData(OrdersInsertService.java:86) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 

얼마나 많은 동시 사용자가 있더라도 상관없이 현재 시간에 따라 UniqueId를 생성하는 것이 어떻게 가능합니까?

+0

http://stackoverflow.com/questions/9191288/creating-a-unique-timestamp-in-java – Criban

답변

0

사용자의 이메일 (데이터베이스에서 고유 한 경우) 또는 데이터베이스의 사용자 ID와 같은 고유 한 문자열을 각 주문 ID에 추가하십시오. 이 독특한 주문 ID를 만드는

문자열 독특한 = 타임 스탬프 + unique_user_field

4

이 때문에 당신의 시간 :보다 빠른 for 루프의 속도로 일어나고있다. 밀리 초 이하의 시간에 루프 반복으로 값을 생성합니다. 데이터베이스에 단일 값을 삽입하려는 경우에만 호출 할 수 있으며 은 값을 반복하지 않습니다.

이외의 용도로는 UUID (은 영숫자 값)을 사용할 수 있습니다.

for (int i = 0; i < 50; i++) { 
     Date dNow = new Date(); 
     SimpleDateFormat ft = new SimpleDateFormat("yyMMddhhmmssMs"); 
     String datetime = ft.format(dNow); 
     System.out.println(datetime); 
} 

OUTPUT

141016030003103 
141016030003103 
141016030003103 
141016030003103 
141016030003103 
141016030003103 
141016030003103 
141016030003103 
141016030003103 
//.....and more 
0

공용 클래스 테스트 {

public static void main(String[] args) { 

    Date d=new Date(); 
    //it will return unique value based on time 
    System.out.println(d.getTime()); 


} 

} 

당신은 날짜 클래스의 getTime를 방법을 사용할 수 있습니다. 이 날짜가 나타내는 1970 년 1 월 1 일 00:00:00 GMT 이후의 밀리 초 수를 반환합니다.

1

이 코드는 현재 타임 스탬프를 사용하여 원하는 수의 고유 ID를 생성하는 데 도움이됩니다. 생성 된 ID의 유형은 long - 64 비트입니다. 최소 17 비트는 새 고유 ID를 생성하라는 요청이 이전 요청과 동일한 밀리 초 단위로 수신 될 때 사용됩니다. 아래 코드에서 Sequence로 식별됩니다. 따라서 코드가 밀리 초당 65536 개의 고유 ID를 생성 할 수 있습니다.

/** 
* Unique id is composed of: 
* current time stamp - 47 bits (millisecond precision w/a custom epoch gives as 69 years) 
* sequence number - 17 bits - rolls over every 65536 with protection to avoid rollover in the same ms 
**/ 

public class UniqueIdGenerator { 
    private static final long twepoch = 1288834974657L; 
    private static final long sequenceBits = 17; 
    private static final long sequenceMax = 65536; 
    private static volatile long lastTimestamp = -1L; 
    private static volatile long sequence = 0L; 

    public static void main(String[] args) { 
     Set<Long> uniqueIds = new HashSet<Long>(); 
     long now = System.currentTimeMillis(); 
     for(int i=0; i < 100000; i++) 
     { 
      uniqueIds.add(generateLongId()); 
     } 
     System.out.println("Number of Unique IDs generated: " + uniqueIds.size() + " in " + (System.currentTimeMillis() - now) + " milliseconds"); 
    } 

    private static synchronized Long generateLongId() { 
     long timestamp = System.currentTimeMillis(); 
     if (lastTimestamp == timestamp) { 
      sequence = (sequence + 1) % sequenceMax; 
      if (sequence == 0) { 
       timestamp = tilNextMillis(lastTimestamp); 
      } 
     } else { 
      sequence = 0; 
     } 
     lastTimestamp = timestamp; 
     Long id = ((timestamp - twepoch) << sequenceBits) | sequence; 
     return id; 
    } 

    private static long tilNextMillis(long lastTimestamp) { 
     long timestamp = System.currentTimeMillis(); 
     while (timestamp <= lastTimestamp) { 
      timestamp = System.currentTimeMillis(); 
     } 
     return timestamp; 
    } 
} 
1

사용이 :

int unique_id= (int) ((new Date().getTime()/1000L) % Integer.MAX_VALUE); 
관련 문제