2016-07-18 103 views
0

我需要一個servlet的服務,它下面的事情的Servlet /生成唯一的字符串

  1. 當用戶請求服務,servlet生成一個從未產生了獨特的5字符串

    。 (0〜9的組合和A〜Z)

  2. 如果用戶接受它,使用唯一的字符串(即#1生成)在彈出主鍵

第一件事就是保存用戶的信息我頭正在使用靜態類變量,隨着請求命中servlet增加1,但在這裏搜索和谷歌說,這真的是一個壞主意,好像多個用戶同時擊中服務,它會打破...

現在我無能爲力了。

增加生成唯一字符串的最佳和最安全的方法是什麼?

回答

1

添加一個字段順序沒有在表中,當過新的請求來自數據庫獲得最高的序列號,然後添加一個即加1,並將其保存

+0

作爲一個也想知道這些數字是發佈的,一個可靠的解決方案。 –

+0

如果多個用戶同時請求,這不會造成同樣的問題嗎?就像,如果有2個或更多的用戶在我處理之前獲得請求,並在表中保存更高的增量序列,該怎麼辦? – RedA

+0

@JoopEggen您能否詳細解釋一下這個解決方案將如何避免上述問題?當多個用戶同時請求時?非常感謝提前 – RedA

0

this site,你的最高數字(ZZZZZ)是426088025.在數據庫世界中,您希望使用一個序列,但是由於您的5個字符限制,您需要確保它不會超過此數字(希望您存儲的記錄少於426M)。

要創建你會做一些這樣的順序:

create sequence your_sequence maxvalue 426088025 no cycle 

這是PostgreSQL的語法 - 你的數據庫可能會有所不同。

然後,在你的代碼,你可以做一個

select nextval('your_sequence') 

,讓您的值,然後進行Base64編碼此值。在PostgreSQL中,「不循環」意味着如果達到最大值,則會引發錯誤。

在Java 8,Base64編碼包括:

import java.util.Base64; 

... 

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

否則,如果你堅持使用舊版本的Java,使用Apache Commons Codec和運行:

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

... 

String userNumber = Base64.encodeBase64String(Integer.toString(integerFromSequenceSelect)); 
相關問題