我需要一個servlet的服務,它下面的事情的Servlet /生成唯一的字符串
- 當用戶請求服務,servlet生成一個從未產生了獨特的5字符串
。 (0〜9的組合和A〜Z)
如果用戶接受它,使用唯一的字符串(即#1生成)在彈出主鍵
第一件事就是保存用戶的信息我頭正在使用靜態類變量,隨着請求命中servlet增加1,但在這裏搜索和谷歌說,這真的是一個壞主意,好像多個用戶同時擊中服務,它會打破...
現在我無能爲力了。
增加生成唯一字符串的最佳和最安全的方法是什麼?
我需要一個servlet的服務,它下面的事情的Servlet /生成唯一的字符串
。 (0〜9的組合和A〜Z)
如果用戶接受它,使用唯一的字符串(即#1生成)在彈出主鍵
第一件事就是保存用戶的信息我頭正在使用靜態類變量,隨着請求命中servlet增加1,但在這裏搜索和谷歌說,這真的是一個壞主意,好像多個用戶同時擊中服務,它會打破...
現在我無能爲力了。
增加生成唯一字符串的最佳和最安全的方法是什麼?
添加一個字段順序沒有在表中,當過新的請求來自數據庫獲得最高的序列號,然後添加一個即加1,並將其保存
據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));
作爲一個也想知道這些數字是發佈的,一個可靠的解決方案。 –
如果多個用戶同時請求,這不會造成同樣的問題嗎?就像,如果有2個或更多的用戶在我處理之前獲得請求,並在表中保存更高的增量序列,該怎麼辦? – RedA
@JoopEggen您能否詳細解釋一下這個解決方案將如何避免上述問題?當多個用戶同時請求時?非常感謝提前 – RedA