2017-06-22 39 views
-1

每次從客戶端收到特定的發佈請求時,服務器應生成一個唯一的整數以生成鏈接(uri:website/question/id/details)並將該整數存儲爲索引鍵)在數據庫中。我試過int idForUri = UniqueInteger.uri.incrementAndGet();但是如果服務器重新啓動,這不起作用。我怎樣才能解決這個問題?即使服務器重新啓動,如何生成唯一的整數

class UniqueInteger { 
    public static AtomicInteger uri = new AtomicInteger(212043); 
} 

添加
表文章
------------
ID INT(11)無符號的auto_increment主鍵
標題爲varchar(50)
內容的文字
uri varchar(50)

每個來自瀏覽器的具體發佈請求導致服務器產生一個新的uri。用戶通過uri訪問該頁面,該頁面由「網站/問題/ id/details」(id是主鍵)組成。但是如果不知道新的身份證,那麼Uri也是未知的。例如,21000是當前表格文章中存在的最大ID。所以需要insert into article(title, content, uri) values (?, ?, 'website/questions/21001/details')。但由於自動增量,服務器不知道21001的值(可能會導致在執行insert之前執行sql select語句)。

用戶通過在瀏覽器中輸入特定的URI來訪問每個文章頁面,一個HTTP請求。服務器應該知道哪些文章僅由接收鏈接發送。所以我給uri添加id(就像SO中的uri,它是questions/question-id/title)。然後通過解析uri中的id字段,服務器可以找到具體的文章。
如何修復設計?

+0

如果服務器重新啓動應該再次生成唯一的int? –

+0

條件是:每次從客戶端收到特定的發佈請求,然後生成一個唯一的整數。最好生成獨特的整數,其值不能太大(小於1000,000,00)。 – user7328234

+0

我認爲你要進行這種背對背的操作 - 插入數據庫並使用自動生成的密鑰 –

回答

1

基於您的意見,最簡單的方法是隻讓DB插入使用自動生成的鍵按正常,

變化getUri方法追加或ID字段插入它

return String.format ("website/question/%d/details", id); 
+0

謝謝,但uri也是表格文章中的一列。所以你不能在知道id之前執行'insert',我會在我的問題中添加更多的細節來說明問題。 – user7328234

+0

不,我是說數據庫中的URL甚至不應該包含'id'你的EntityBean上的** getter **應該執行邏輯 –

+0

我仍然對此感到困惑。當用戶在瀏覽器中鍵入uri時,服務器如何在uri中找到沒有id的表文章中的特定項目。 – user7328234

3

在數據庫中使用SEQUENCE或等效概念。

+0

我在我的問題中增加了更多細節。 – user7328234

+1

答案仍然適用:從數據庫獲取新的ID值,然後插入記錄。另外,爲什麼你需要存儲URI?這不僅僅是通過知道身份證明來決定的。 – Henry

+0

是的,只有瞭解身份證件才能確定。用戶通過在瀏覽器中輸入特定的uri來訪問每個文章頁面,一個HTTP請求。服務器應該知道哪些文章僅通過接收鏈接發送。所以我添加id到uri(就像在uri中的uri,它是questions/question-id/title),然後通過解析uri中的id字段,服務器可以找到特定的文章。 – user7328234